【问题标题】:Why .NET exceptions are mutable?为什么 .NET 异常是可变的?
【发布时间】:2011-03-06 01:30:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net exception-handling exception throw


    【解决方案1】:

    StackTrace 至少对我来说是有意义的。这个想法是Exception(作为对象)可以被传递,从方法返回等等。StackTrace 仅在抛出和捕获异常时才重要。从某种意义上说,StackTrace 实际上更多的是异常抛出的属性,而不是Exception 对象本身。

    关于其他属性的可变性,我认为这只是因为通过分配属性而不是强制将它们全部放入构造函数来构造实例更容易。请记住,在设计 Exception 时,C# 没有可选参数。

    您可以考虑重新设计Exception 和派生类是不可变的,但这需要异常工厂或构建器类。它只会使从Exception 派生变得更加复杂。

    【讨论】:

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