Я новичок в 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
В качестве альтернативы можно ли просто использовать FIRST LINE трассировки стека для отображения пользователю? Эта ссылка - это то, что я получал в своем первоначальном вопросе выше:
http://www3.ntu.edu.sg/home/ehchua/programming/howto/ErrorMessages.html
Например, если идентификатор Exception
всегда используется, можно просто извлечь текст, который находится между Exception
и концом первой строки. Я не знаю, можем ли мы полагаться на Exception
, всегда находясь там.