Почему встроенные сообщения об исключениях не имеют конкретных деталей? (например, ключ из словаря)

Я уверен, что видел это в различных сообщениях исключения в рамках. Я проверил следующие страницы из библиотеки MSDN, но не смог найти много рекомендаций для содержимого сообщения:

Бросок исключений
Сообщение об ошибках
Свойство Exception.Message

Единственная часть первой страницы, которая могла бы объяснить это, - это текст:

Не раскрывайте конфиденциальную информацию в сообщениях об исключениях не требуя соответствующих разрешений.

Это аргумент ArgumentException, созданный Dictionary < TKey, TValue > .Add метод, который напомнил мне об этой проблеме. Это выглядит так:

System.ArgumentException : An item with the same key has already been added.

Почему это не выглядит примерно так?

System.ArgumentException : An item with the same key(123) has already been added.

Это предполагает, что 123 - значение TKey, в основном любой формат с значением TKey - это то, что мне было бы полезно отслеживать ошибку при отладке.

Есть ли известная причина, почему это не включено?

Будет ли считаться неправильной практикой повторное исключение аргумента с ключом в сообщении? Я рассматривал возможность создания своего собственного подкласса исключений, но я думаю, что это случай, когда использование встроенного класса исключений кажется лучшим вариантом.

Ответы

Ответ 1

Как правило, исключительные ситуации в рамках структуры хотят избежать создания новых исключительных ситуаций. Чтобы отформатировать сообщение следующим образом:

System.ArgumentException : An item with the same key(123) has already been added.

Можно было бы предположить, что существует действительная реализация toString в ключевом параметре. Но что, если это null? Или, если это настраиваемый ключ, который генерирует новое исключение в toString? Или даже какой-то идиот реализовал метод toString, который выбрасывает случайное исключение 1 из 10 раз? Что, если внутреннее исключение было вызвано ситуацией с отсутствием памяти, и преобразование просто вызовет ее снова? Это даст более непредсказуемые результаты, чем просто сообщение о том, что он уверен, чтобы иметь возможность сообщать.

Ответ 2

Похоже на меры предосторожности. Программа может работать с чувствительными к безопасности данными, поэтому она заботится о том, чтобы не записывать в сообщения журнала или не показывать через пользовательский интерфейс. Но, oops, есть проблема, и необработанное исключение отключается, когда какой-либо обработчик по умолчанию отображает или записывает фрагменты этой важной информации, поскольку он был включен в текст исключения.