Почему в большинстве исключений отсутствует информация, относящаяся к конкретному экземпляру? - PullRequest
12 голосов
/ 12 декабря 2011

Я заметил, что большинство сообщений об исключениях не содержат специфических для экземпляра деталей, таких как значение, вызвавшее исключение. Обычно они сообщают вам только «категорию» ошибки.

Например, при попытке сериализации объекта с третьим. библиотека, я получил MissingMethodException с сообщением:

"Для этого объекта не определен конструктор без параметров."

Во многих случаях этого достаточно, но часто (обычно во время разработки) появляется сообщение типа

"Для этого объекта типа 'Foo' не определен конструктор без параметров."

может сэкономить много времени, указав причину ошибки.

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

Это сделано специально?

Есть ли последствия для безопасности при раскрытии внутреннего состояния, например, "ошибочного" значения переменной?

Ответы [ 4 ]

4 голосов
/ 12 декабря 2011

InvalidArgumentException и (согласно @Ian Nelson) «Ключ не найден в словаре» оба имеют что-то общее - нет никакой гарантии, что каркас сможет найти подходящее значение, чтобы показать вам - если ключ / аргументлюбого определенного пользователем типа, и ToString() не был переопределен, тогда вы просто получите имя типа - он не будет добавлять много значения.

4 голосов
/ 12 декабря 2011

Две причины, по которым я могу придумать:

Во-первых, может быть, параметр, выдавший исключение, представлял собой значение, которое было обработанной формой того, которое было передано в открытый интерфейс.Значение может не иметь смысла без затрат на перехват для повторного выброса другого исключения, которое в любом случае будет одинаковым в большинстве случаев.

Во-вторых, и что более важно, это то, что действительно может быть риск для безопасности,об этом трудно догадаться (если я пишу контейнер общего назначения, я не знаю, в каких контекстах он будет использоваться).Мы не хотим, чтобы «Кредитная карта: 5555444455554444» появлялась в сообщении об ошибке, если мы можем помочь.

В конечном счете, только то, какая отладочная информация является наиболее полезной, будет зависеть от ошибки в любом случае.Если тип, метод и (когда это возможно) номер файла и строки не достаточно, пришло время написать некоторый отладочный код, который перехватывает именно то, что вы действительно хотите знать, вместо того, чтобы жаловаться, что он еще не перехвачен, когда вы в следующий разможет потребоваться другая информация (состояние полей экземпляров может быть столь же полезным, как и параметры).

2 голосов
/ 12 декабря 2011

Исключения в основном предназначены для использования программой. Большинство программ не знают, что делать с информацией об экземпляре.

Свойство Message предназначено для потребления человеком. За исключением сценария отладки, люди не будут знать, что делать с Foo.

1 голос
/ 12 декабря 2011

Многие механизмы исключений пытаются служить мешаниной ортогональных целей путем передачи одного объекта, полученного из исключений:

  1. Уведомление вызывающего абонента о том, что произошли различные конкретные события или существуют различные конкретные проблемы.
  2. Определение, когда исключительное условие «разрешается», чтобы можно было продолжить нормальный поток программы.
  3. Предоставление указания о том, что сказать пользователю программы
  4. Предоставление информации, которую можно зарегистрировать, чтобы владельцы системы могли выявлять проблемы при наличии защищенного журнала.
  5. Предоставление информации, которая может быть зарегистрирована, чтобы позволить владельцам системы выявлять проблемы, но которая не представляла бы угрозу безопасности, даже если безопасная регистрация не доступна.

К сожалению, я не знаю ни о каком механизме исключений в широко распространенном использовании, который может фактически выполнить все пять из вышеперечисленных, хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...