我必须捕获(Exception ex)
,更改它的消息,然后重新抛出它。
如果我throw new Exception(newMessage, ex);
,那么我就失去了异常的运行时类型,对吗?
如果我throw;
,那么我可以保留运行时类型但消息不会改变。
因为我正在捕捉,所以我不知道派生类型 ex
可能是什么,所以我无法构造正确的类型。
当然,如果我 throw ex;
我会丢失堆栈跟踪。
有没有办法重新格式化 ex
的消息并在不丢失堆栈或运行时类型信息的情况下重新抛出它,而不求助于任何奇怪的脆弱反射黑客?
最佳答案
由于您已经有效地排除了问题的所有合理解决方案,因此剩下的唯一答案是“不,您不能这样做”。 Exception
的Message
是只读的。它甚至不能使用“脆弱的反射 hacks”来设置,因为该属性是 virtual
,因此对于任何特定的异常类型,根本不需要来自支持字段。下面的类应该证明你的需求是不可能的:
sealed class OzymandiasException : Exception {
public override string Message => "Look upon my message, ye mighty, and despair.";
}
无法生成任何 OzymandiasException
实例,当被捕获时将具有不同的 Message
。
关于c# - 捕获异常并使用保留实际类型的新消息重新抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37577629/