C# 捕获异常并使用保留实际类型的新消息重新播放

C# 捕获异常并使用保留实际类型的新消息重新播放,c#,exception,C#,Exception,我必须捕获(异常示例),更改其消息,然后重新播放它 如果我抛出新异常(newMessage,ex),那么我将丢失异常的运行时类型,对吗 如果我抛出,则我可以保留运行时类型,但消息不会更改 由于我正在捕获,我不知道派生类型ex可能是什么,因此无法构造正确的类型 当然,如果我抛出ex我丢失了堆栈跟踪 有没有一种方法可以重新格式化ex的消息,并在不丢失堆栈或运行时类型信息的情况下重新播放它,而不必求助于任何奇怪的脆性反射黑客?既然您已经有效地消除了问题的所有合理解决方案,剩下的唯一答案就是“不,您不能

我必须
捕获(异常示例)
,更改其消息,然后重新播放它

如果我
抛出新异常(newMessage,ex),那么我将丢失异常的运行时类型,对吗

如果我
抛出,则我可以保留运行时类型,但消息不会更改

由于我正在捕获,我不知道派生类型
ex
可能是什么,因此无法构造正确的类型

当然,如果我抛出ex我丢失了堆栈跟踪


有没有一种方法可以重新格式化
ex
的消息,并在不丢失堆栈或运行时类型信息的情况下重新播放它,而不必求助于任何奇怪的脆性反射黑客?

既然您已经有效地消除了问题的所有合理解决方案,剩下的唯一答案就是“不,您不能这样做”。
异常的
消息
是只读的。它甚至不能使用“脆性反射hacks”进行设置,因为属性是
虚拟的
,因此对于任何特定的异常类型,都不需要来自备份字段。以下课程应证明您的要求是不可能的:

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

捕获时无法生成任何具有不同
消息的
OzymandiaseException
实例,该实例将抛出另一种类型(可能是应用程序类型?),并将原始异常设置为内部异常为什么不能使用
InnerException
的最内部异常?您是否在“上面”的某个地方有一个键入的
catch
?您必须使用从基“exception”类派生的自定义异常类。通过这种方式,您还可以跟踪多层体系结构中原始异常发生在哪一层,并将能够在一个位置记录所有异常。默认情况下,异常的
Message
属性为只读。因此,除非您为特定的异常类型显式编码,否则无论如何都不能更改异常的消息。