将异常类型更改为基础 class

Changing Exception type to base class

我有两个项目。其中一个我使用 MailKit,它负责各种电子邮件。 在这里我可以得到 SmtpCommandExceptionsSmtpProtocolExceptions 派生自 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 的情况下捕获包装的异常。