为什么.NET异常是可变的?

11

我想知道为什么.NET基类库的异常类默认具有一些可变成员

  • 为什么我可以更改SourceHelpLinkData的值,但不能更改像Message这样的任何其他内容?
  • 为什么抛出异常会重写StackTrace,使其也成为可变的?将堆栈跟踪信息附加到现有跟踪中是否是更好的设计(但仍然是可变的)?
  • .NET异常设计可能存在哪些改进之处?

我只对设计选择感兴趣...

1个回答

10
StackTrace 对我来说很有意义。其想法是,Exception(作为一个对象)可能会被传递、从方法中返回等。当抛出和捕获异常时,StackTrace 只是重要的。在某种意义上,StackTrace 更像是异常 抛出 的属性,而不是 Exception 对象本身的属性。
关于其他属性的可变性,我认为这只是因为通过赋值给属性更容易构造实例,而不必将它们全部强制放入构造函数中。请记住,在设计Exception时,C# 没有可选参数。
您可以考虑重新设计,使 Exception 和派生类成为不可变的,但这将需要一个异常工厂或构建器类。这只会使从 Exception 派生变得更加复杂。

好的,如果问题是将大量数据传递到异常中,为什么Message属性是只读的? - controlflow
“Message”是唯一的非可选信息,因此将其放在构造函数中是有意义的。 - Stephen Cleary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接