【发布时间】:2016-06-01 19:53:32
【问题描述】:
我必须catch (Exception ex),更改它的消息,然后重新抛出它。
如果我throw new Exception(newMessage, ex);,那么我会丢失异常的运行时类型,对吧?
如果我throw;,那么我可以保留运行时类型但消息不会改变。
由于我在抓,不知道ex可能是什么派生类型,所以无法构造正确的类型。
当然,如果我 throw ex; 我会丢失堆栈跟踪。
有没有办法重新格式化ex 的消息并重新抛出它,而不会丢失堆栈或运行时类型信息,而不需要使用任何奇怪的脆弱反射黑客?
【问题讨论】:
-
抛出另一种类型(可能是应用程序类型?)并将原始异常设置为内部异常
-
为什么不能只使用
InnerException的最里面的异常?您是否在“上方”某处输入了catch? -
您必须使用派生自基“异常”类的自定义异常类。这样,您还可以在多层架构中跟踪原始异常发生在哪一层,并能够在一个地方记录所有异常。
-
默认情况下,异常的
Message属性是只读的。因此,除非您为特定的异常类型显式编码,否则无论如何都不能只更改异常的消息。