Я новичок в 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
Строка, которую я хочу показать пользователю: Описание ошибки здесь
. Я могу извлечь эту строку с помощью регулярных выражений, потому что я знаю, что (1) эта строка всегда находится в первой строке, поэтому я могу извлечь первую строку трассировки стека ошибок, и (2) эта строка всегда начинается с Error
и заканчивается концом строки. [Примечание для пользователей Oracle (не хочу вводить вас в заблуждение): вышеизложенное применимо только при использовании RAISE_APPLICATION_ERROR со строкой ошибки, начинающейся с Error
, в противном случае текста Error
там нет ].
Мои вопросы по Java:
(1) Есть ли что-то потенциально конфиденциальное, что вы не хотите, чтобы пользователи видели в стеке ошибок? Если так, то? Например, пути к файлам, имя/IP-адрес сервера и т. д.
(2) Существуют ли какие-либо правила форматирования для трассировки стека ошибок Java, на которые я могу положиться при извлечении неконфиденциальной информации? Или как другим решить эту проблему?
ОБНОВЛЕНИЕ 1:
Спасибо за все ответы, они были очень полезны. Хотя многие люди комментируют использование такой функции, как getUserFriendlyMessage()
, для сопоставления ошибок с полезными пользовательскими сообщениями, мне интересно, может ли кто-нибудь расширить это сопоставление. То есть для распространенных ошибок (SQL, ввод-вывод и т. д.), какой «надежный» идентификатор можно использовать для поиска в этом стеке ошибок, чтобы определить тип произошедшей ошибки, а затем какую соответствующую текстовую строку вы бы порекомендовали. сопоставить с этим сообщением об ошибке, чтобы показать пользователю? Ответ @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 support@companyname.com.
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
всегда будет там.