【问题标题】:Catch Exception and rethrow with a new message preserving actual type捕获异常并使用保留实际类型的新消息重新抛出
【发布时间】:2016-06-01 19:53:32
【问题描述】:

我必须catch (Exception ex),更改它的消息,然后重新抛出它。

如果我throw new Exception(newMessage, ex);,那么我会丢失异常的运行时类型,对吧?

如果我throw;,那么我可以保留运行时类型但消息不会改变。

由于我在抓,不知道ex可能是什么派生类型,所以无法构造正确的类型。

当然,如果我 throw ex; 我会丢失堆栈跟踪。

有没有办法重新格式化ex 的消息并重新抛出它,而不会丢失堆栈或运行时类型信息,而不需要使用任何奇怪的脆弱反射黑客?

【问题讨论】:

  • 抛出另一种类型(可能是应用程序类型?)并将原始异常设置为内部异常
  • 为什么不能只使用InnerException 的最里面的异常?您是否在“上方”某处输入了catch
  • 您必须使用派生自基“异常”类的自定义异常类。这样,您还可以在多层架构中跟踪原始异常发生在哪一层,并能够在一个地方记录所有异常。
  • 默认情况下,异常的Message 属性是只读的。因此,除非您为特定的异常类型显式编码,否则无论如何都不能只更改异常的消息。

标签: c# exception


【解决方案1】:

既然你已经有效地排除了问题的所有合理解决方案,剩下的唯一答案就是“不,你不能这样做”。 ExceptionMessage 是只读的。它甚至不能使用“脆性反射黑客”来设置,因为属性是virtual,因此对于任何特定的异常类型根本不需要来自支持字段。以下课程应该证明您的需求是不可能的:

sealed class OzymandiasException : Exception {
    public override string Message => "Look upon my message, ye mighty, and despair.";
}

当被捕获时,无法生成任何OzymandiasException 实例,该实例将具有不同的Message

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2019-02-22
    • 2010-10-03
    • 2011-06-27
    相关资源
    最近更新 更多