我想知道为什么基类库中的 .NET 异常类默认有一些可变成员
- 为什么我可以从 更改
Source
和HelpLink
值Data
,但不能更改其他类似Message
? - 为什么抛出异常
StackTrace
也会重写使其可变?将堆栈跟踪信息附加到现有跟踪会是更好的设计(但仍然是可变的)吗? - .NET 异常设计有哪些可能的改进?
我对设计选择很感兴趣...
我想知道为什么基类库中的 .NET 异常类默认有一些可变成员
Source
和HelpLink
值Data
,但不能更改其他类似Message
?StackTrace
也会重写使其可变?将堆栈跟踪信息附加到现有跟踪会是更好的设计(但仍然是可变的)吗?我对设计选择很感兴趣...
StackTrace
至少对我来说是有意义的。这个想法是一个Exception
(作为一个对象)可以被传递,从方法中返回,等等。StackTrace
只有在抛出和捕获异常时才重要。从某种意义上说,StackTrace
真的更多的是抛出异常的一种属性,而不是Exception
对象本身。
关于其他属性的可变性,我认为这只是因为通过分配给属性而不是强制将它们全部放入构造函数来构造实例更容易。请记住,在Exception
设计时,C# 没有可选参数。
您可以考虑重新设计Exception
派生类是不可变的,但这需要异常工厂或构建器类。它只会使派生Exception
变得更加复杂。