我必须catch (Exception ex)
,更改其信息,然后重新抛出它。
如果我throw new Exception(newMessage, ex);
,那么我将丢失异常的运行时类型,对吗?
如果我throw;
,那么我可以保留运行时类型,但消息不会改变。
由于我正在捕捉,我不知道派生类型ex
可能是什么,所以我无法构造正确的类型。
当然,如果我throw ex;
我丢失了堆栈跟踪。
有没有办法重新格式化ex
的消息并重新抛出它而不会丢失堆栈或运行时类型信息,而不会诉诸任何奇怪的脆弱反射黑客?
答案 0 :(得分:2)
由于你已经有效地消除了问题的所有合理解决方案,唯一的答案仍然是“不,你不能这样做”。 Message
的{{1}}是只读的。它甚至不能使用“脆弱反射黑客”进行设置,因为属性为Exception
,因此对于任何特定的异常类型,根本不需要来自后备字段。以下课程应证明您的要求是不可能的:
virtual
当捕获sealed class OzymandiasException : Exception {
public override string Message => "Look upon my message, ye mighty, and despair.";
}
时,无法生成OzymandiasException
的任何实例。