Как не проверенные исключения сообщаются пользователю - PullRequest
1 голос
/ 12 июля 2010

Поскольку нет необходимости пытаться / ловить или указывать не отмеченные исключения, как они сообщаются пользователю?

Ответы [ 4 ]

3 голосов
/ 12 июля 2010

как они сообщаются пользователю?Как лучше всего обрабатывать непроверенные исключения?

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

Способ, которым мы имеем дело с ним, прост: это настольное приложение, если мы улавливаем необработанное исключениеМы предлагаем пользователю возможность отправить нам отчет.Все, что нужно сделать пользователю, это нажать «Отчет», и мы получим полную трассировку стека и другую информацию, отправленную на один из наших серверов.

Вы можете настроить обработчик неперехваченных исключений для всего приложения, например, так:

Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() {
    public void uncaughtException( final Thread t, final Throwable e ) {
       ...
       // Here we offer our user the possibility to 'report' the exception, YMMV
    }
 }

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

Некоторые фреймворки, такие как Spring, также имеют довольно сильное предпочтение менталитету «нет проверенных исключений» .

Так что исключения для нас действительно исключительный, поэтому всплывающее окно предупреждает пользователя о сбое приложения и дает ему возможность отправить нам отчет.

2 голосов
/ 12 июля 2010

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

подробности:

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

Пример сообщения об ошибке

Пример сообщения об ошибке http://www.flickr.com/photos/aniketn/4785197367/

1 голос
/ 12 июля 2010

На самом деле вы можете ловить непроверенные исключения.Просто они обычно не решаются, когда вы их ловите, например, NullPointerException.Как правило, нет способа плавно и изящно возобновить то, что вы делали, когда произошло NullPointerException.

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

Лучше всего иметь дело с теми, где может обеспечить лучшую обработку, чем по умолчанию.Например, если вы вызываете функцию внешней библиотеки, вы можете заключить ее в блок try / catch, а если библиотека выдает NullPointerException, вы можете дать пользователю сообщение об ошибке friendly (GUI).X не смог сделать Y - вы указали правильный Z? ") Вместо трассировки стека в командной строке.Но в общем случае причина, по которой они не контролируются, заключается в том, что даже если бы вы знали о них, ничего не оставалось бы, кроме как поднять руки.

0 голосов
/ 12 июля 2010

При выходе из основного (...) метода JVM печатает трассировку стека в System.out и выходит из этого потока. Для однопоточных программ это также приведет к выходу из программы.

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

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