Почему исключения .NET являются изменяемыми?

Мне интересно, почему в классах исключений .NET из библиотеки базового класса по умолчанию есть некоторые изменяемые члены.

  • Почему я могу изменить Source, HelpLink и значения из Data, но не могу изменить ничего подобного, как Message?
  • Почему бросание исключения перезаписывает StackTrace, что делает его изменчивым? Добавление информации о трассировке стека в существующую трассировку было бы лучше (но все же изменяемо)?
  • Какие возможные улучшения в дизайне исключений .NET могут быть?

Мне интересно только выбор дизайна...

Ответ 1

StackTrace имеет смысл для меня, по крайней мере. Идея состоит в том, что объект Exception (как объект) может быть передан, возвращен из методов и т.д. StackTrace важен только в том случае, если исключение выбрано и поймано. В некотором смысле, StackTrace действительно является скорее свойством бросания исключения, а не самого объекта Exception.

Что касается изменчивости других свойств, я предполагаю, что это просто потому, что проще построить экземпляр, присваивая свойствам, а не принуждая их всех в конструктор. Помните, что в то время, когда было разработано Exception, у С# не было необязательных параметров.

Можно подумать о перепроектировании, где Exception и производные классы неизменяемы, но для этого потребуется исключение factory или класс строителя. Это просто сделало бы более сложным из Exception.