簡體   English   中英

將異常類型更改為基本 class

[英]Changing Exception type to base class

我有兩個項目。 在其中一個中,我使用 MailKit,它負責各種 email。 在這里,我可以獲得從CommandException派生的SmtpCommandExceptionsSmtpProtocolExceptions ,后者派生自正常的System.Exception 我想在不將完整的 MailKit 綁定到另一個項目的情況下將例外提供給另一個項目。 所以我考慮將附加屬性放入字符串中,將它們放在一起並將其他所有內容發送回去。

有沒有辦法從派生的 class 中提取異常並丟棄所有其他方法、屬性等?

處理此類問題的典型方法是將異常包裝在自定義異常 class 中:

public class MyWrappedException : Exception
{
    public string MyProperty { get; }

    public MyWrappedException(string message, string myProperty, Exception innerException)
        : base(message, innerException)
    {
        MyProperty = myProperty;
    }
}

像這樣調用:

  try
  {
      DoSomething();
  }
  catch(InvalidOperationException ex)
  {
      throw new MyWrappedException("Oups", "tried doing X", ex);
  }

這會保留所有原始異常信息,但除非您使用調試器或在轉換為字符串時包含它,否則其中大部分將不可見。 您可以 select 您想在包裝器中包含哪些屬性。 這使您可以在不直接依賴 mailkit 的情況下捕獲包裝的異常。

就堆棧跟蹤而言,您可以只傳遞基本異常。 但是,如果您想了解更多信息,特別是某些異常 class,我可以想到一種解決方案。

例如,創建一個 class,如:

public class ExceptionInfo
{
    public string Message {get;set;}
    public int SomeValue {get;set;}
    public double SomeOtherValue {get;set;}
    
    public readonly Exception OriginalException;
    
    public ExceptionInfo(Exception originalEx)
    {
        OriginalException = originalEx;
    }
}

現在,當您捕獲特定異常時,您可以像這樣序列化它:

catch(SmtpCommandException ex)
{
   ExceptionInfo info = ex.MakeExceptionInfo(); //this should be some helper method
   SendException(info);
}

現在,解決方案是為每種異常創建一個輔助方法,或者只是一些通用方法,該方法將使用您想要的常見異常值創建您的 ErrorInfo。 例如:

public static ExceptionInfo MakeExceptionInfo(this SmptCommandException ex)
{
    ExceptionInfo result = new ExceptionInfo(ex);
    result.SomeValue = ex.SomevalueFromOriginalException;

    return result;
}

接下來,當您擁有 ExceptionInfo class 時,您可以將其發送到應用程序的其他部分。

首先,我認為您可以使用序列化(例如 json),但我認為這個解決方案更加清晰。 但需要一些編碼。 也許您會想出將我的想法與 json 相結合的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM