Java: какую информацию в трассировке стека ошибок мы обычно не хотим показывать пользователям?
Я новичок в Java, и я не очень знаком с правилами форматирования, используемыми трассировкой стека ошибок, когда она генерируется и впоследствии отображается конечному пользователю моего веб-приложения.
Мой опыт работы с базой данных Oracle состоит в том, что стек ошибок содержит внутреннюю информацию, такую как имена схем и процедур и номера строк, которые, хотя и полезны для отладки, я бы хотел, чтобы пользователь не видел. Вот пример:
java.sql.SQLException : ORA-20011: Error description here
ORA-07894: at "NAME_OF_SCHEMA.PROCEDURE_NAME", line 121
ORA-08932: at line 10
Строка, которую я хочу отобразить пользователюError description here
, Я могу извлечь эту строку, используя выражения регулярных выражений, потому что я знаю (1) эта строка всегда находится на первой строке, поэтому я могу извлечь первую строку трассировки стека ошибок, и (2) эта строка всегда начинается сError
и заканчивается концом строки. [Примечание для пользователей Oracle (я не хочу вводить вас в заблуждение): вышесказанное применимо только при использовании RAISE_APPLICATION_ERROR со строкой ошибки, начинающейся сError
иначе текстError
не там].
Мои вопросы по Java:
(1) Есть ли что-нибудь потенциально чувствительное, что вы не хотели бы, чтобы пользователи видели в стеке ошибок? Если да, то? Например, пути к файлам, имя сервера / IP и т. Д.
(2) Существуют ли какие-либо правила форматирования для трассировки стека ошибок Java, на которые я могу опираться при извлечении нечувствительной информации? Или как другим решать эту проблему?
ОБНОВЛЕНИЕ 1:
Спасибо за все ответы, они были очень полезны. Хотя многие люди комментируют, чтобы использовать такую функцию, какgetUserFriendlyMessage()
чтобы сопоставить ошибки с полезными пользовательскими сообщениями, интересно, кто-нибудь мог бы расширить это отображение. То есть, для распространенных ошибок (SQL, I / O и т. Д.), Что является "надежным" идентификатор можно использовать для поиска в этом стеке ошибок, чтобы определить тип произошедшей ошибки, а затем какую соответствующую текстовую строку вы бы порекомендовали сопоставить с этим сообщением об ошибке, чтобы показать пользователю? Ответ @ Adarshr ниже - хорошее начало. Например,
Identified Expected If found in error stack, display this friendly msg to user
------------------- ----------------------------------------------------------
SQLException An error occurred accessing the database. Please contact support at [email protected].
IOException Connection error(?). Please check your internet connection.
Предположим, что ошибки, связанные с компиляцией, не нужно устранять, а сосредоточьте внимание на тех ошибках, которые могут возникнуть у конечных пользователей при обычном использовании. Для справки, вот список сообщений об ошибках во время выполнения:http://mindprod.com/jgloss/runerrormessages.html#IOEXCEPTION
В качестве альтернативы, возможно ли просто использовать ПЕРВАЯ ЛИНИЯ трассировки стека для отображения пользователю? Эта ссылка является чем-то вроде того, на что я ссылался в моем первоначальном вопросе выше:
http://www3.ntu.edu.sg/home/ehchua/programming/howto/ErrorMessages.html
Например, если идентификаторException
всегда используется, можно просто извлечь текст, который находится междуException
и конец первой строки. Я не знаю, можем ли мы положиться наException
всегда быть там.