Исключения не содержат полезных подробностей, поскольку концепция исключений еще недостаточно сформировалась в рамках дисциплины разработки программного обеспечения, поэтому многие программисты не понимают их полностью и поэтому не обращаются с ними должным образом.
Да, IndexOutOfRangeException
должен содержать точный индекс, выходящий за пределы диапазона, а также диапазон, который был действителен в момент его создания, и это презренно со стороны создателей среды выполнения .NET, чего нет. Да, table or view not found
исключение Oracle должно содержать имя таблицы или представления, которое не было найдено, и, опять же, тот факт, что это не так, является презренным от имени того, кто несет за это ответственность.
В значительной степени путаница проистекает из ошибочной первоначальной идеи о том, что исключения должны содержать понятные человеку сообщения, что, в свою очередь, связано с отсутствием понимания того, что такое исключения, так что это порочный круг.
Поскольку люди думают, что исключение должно содержать удобочитаемое сообщение, они считают, что любая информация, содержащаяся в исключении, также должна быть отформатирована в удобочитаемое сообщение, а затем им надоедает написать все читаемое человеком сообщение. строительный кодекс, или они боятся, что это может разглашать неоправданное количество информации любопытным глазам, которые увидят сообщение. (Проблемы безопасности, упомянутые в других ответах.)
Но правда в том, что они не должны беспокоиться об этом, потому что исключение не должно содержать удобочитаемого сообщения. Исключения - это вещи, которые должны видеть и / или иметь дело только программисты. Если когда-либо возникает необходимость представить пользователю информацию об ошибках, это необходимо сделать на очень высоком уровне, сложным образом и на языке пользователя, который, по статистике, вряд ли будет английским.
Таким образом, для нас, программистов, «сообщение» об исключении является именем класса исключения , и любая другая информация, относящаяся к исключению, должна быть скопирована в (окончательные / только для чтения) переменные-члены объекта исключения. Предпочтительно, каждый мыслимый маленький кусочек этого. Таким образом, сообщение не должно (или должно) генерироваться, и поэтому никакие посторонние глаза не могут его увидеть.
Чтобы ответить на озабоченность, выраженную Томасом Оуэнсом в комментарии ниже:
Да, конечно, на каком - то уровне, вы будете создавать сообщение журнала относительно исключения. Но вы уже видите проблему с тем, что говорите: с одной стороны, сообщение журнала исключений без трассировки стека бесполезно, но, с другой стороны, вы не хотите, чтобы пользователь видел всю трассировку стека исключений. Опять же, наша проблема здесь заключается в том, что наша перспектива искажена традиционными методами. Файлы журналов традиционно были в виде простого текста, что, возможно, было хорошо, когда наша дисциплина была в зачаточном состоянии, но, возможно, уже не так: если существует проблема безопасности, тогда файл журнала должен быть двоичным и / или зашифрованным.
Бинарный или простой текстовый файл должен рассматриваться как поток, в который приложение сериализует отладочную информацию. Такой поток предназначен только для глаз программистов, и задача генерации отладочной информации для исключения должна быть такой же простой, как сериализация исключения в поток журнала отладки. Таким образом, просматривая журнал, вы видите имя класса исключения (которое, как я уже говорил, для всех практических целей - «сообщение»), каждая из переменных-членов исключения, которые описывают все, что уместно, - и - практическое включение в журнал и трассировка всего стека. Обратите внимание, что форматирование читаемого человеком сообщения об исключении явно отсутствует в этом процессе.
PS
Еще несколько моих мыслей на эту тему можно найти в этом ответе: Как написать хорошее сообщение об исключении
PPS
Похоже, что многие люди были помечены моим предложением о бинарных файлах журналов, поэтому я еще раз изменил ответ, чтобы сделать еще более ясным то, что я предлагаю здесь не то, что файл журнала должен быть двоичным, а что файл журнала может быть двоичным, если это необходимо.