使用保留实际类型的新消息捕获异常并重新抛出

时间:2016-06-01 19:53:33

标签: c# exception

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

由于你已经有效地消除了问题的所有合理解决方案,唯一的答案仍然是“不,你不能这样做”。 Message的{​​{1}}是只读的。它甚至不能使用“脆弱反射黑客”进行设置,因为属性为Exception,因此对于任何特定的异常类型,根本不需要来自后备字段。以下课程应证明您的要求是不可能的:

virtual

当捕获sealed class OzymandiasException : Exception { public override string Message => "Look upon my message, ye mighty, and despair."; } 时,无法生成OzymandiasException的任何实例。