Почему встроенные сообщения об исключениях не имеют конкретных деталей? (например, ключ из словаря)
Я уверен, что видел это в различных сообщениях исключения в рамках. Я проверил следующие страницы из библиотеки 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, есть проблема, и необработанное исключение отключается, когда какой-либо обработчик по умолчанию отображает или записывает фрагменты этой важной информации, поскольку он был включен в текст исключения.