将异常类型更改为基础 class
Changing Exception type to base class
我有两个项目。其中一个我使用 MailKit,它负责各种电子邮件。
在这里我可以得到 SmtpCommandExceptions
或 SmtpProtocolExceptions
派生自 CommandException
派生自正常的 System.Exception
。
我想在不将完整的 MailKit 绑定到其他项目的情况下将例外情况提供给其他项目。所以我考虑将附加属性放入字符串中,将它们放在一起并将其他所有内容发回。
是否有任何方法可以从派生的 class 中提取异常并丢弃所有其他方法、属性等?
就堆栈跟踪而言,您可以只传递基础异常。
但如果您需要更多信息,具体到某些异常 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.
相结合的解决方案
处理此类问题的典型方法是将异常包装在自定义异常中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 的情况下捕获包装的异常。
我有两个项目。其中一个我使用 MailKit,它负责各种电子邮件。
在这里我可以得到 SmtpCommandExceptions
或 SmtpProtocolExceptions
派生自 CommandException
派生自正常的 System.Exception
。
我想在不将完整的 MailKit 绑定到其他项目的情况下将例外情况提供给其他项目。所以我考虑将附加属性放入字符串中,将它们放在一起并将其他所有内容发回。
是否有任何方法可以从派生的 class 中提取异常并丢弃所有其他方法、属性等?
就堆栈跟踪而言,您可以只传递基础异常。 但如果您需要更多信息,具体到某些异常 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.
相结合的解决方案处理此类问题的典型方法是将异常包装在自定义异常中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 的情况下捕获包装的异常。