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