[英]Changing Exception type to base class
我有兩個項目。 在其中一個中,我使用 MailKit,它負責各種 email。 在這里,我可以獲得從CommandException
派生的SmtpCommandExceptions
或SmtpProtocolExceptions
,后者派生自正常的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.