Java Exceptions - Обработка исключений без попытки try - PullRequest
15 голосов
/ 05 июня 2011

В Java мы обрабатываем исключения, используя блоки try catch. Я знаю, что могу написать блок try catch, подобный приведенному ниже, чтобы перехватить любое исключение, выброшенное в методе.

try {
  // do something
}
catch (Throwable t) {

}

Но есть ли в Java какой-либо способ, позволяющий мне вызывать определенный метод, вызываемый при возникновении исключения, вместо написания универсального метода, подобного описанному выше?

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

Спасибо.

Ответы [ 4 ]

28 голосов
/ 05 июня 2011

По умолчанию JVM обрабатывает необработанные исключения, печатая трассировку стека в поток System.err. Java позволяет нам настраивать это поведение, предоставляя нашу собственную подпрограмму, которая реализует интерфейс Thread.UncaughtExceptionHandler.

Взгляните на эту статью в блоге, которую я написал некоторое время назад, которая объясняет это подробно (http://blog.yohanliyanage.com/2010/09/know-the-jvm-1-uncaught-exception-handler/).

Таким образом, все, что вам нужно сделать, это написать свою собственную логику, как показано ниже:

public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
  public void uncaughtException(Thread t, Throwable e) {
     // Write the custom logic here
   }
}

И установите его, используя любой из трех вариантов, которые я описал в приведенной выше ссылке. Например, вы могли бы сделать следующее, чтобы установить обработчик по умолчанию для всей JVM (таким образом, любое обработанное исключение будет обработано этим обработчиком).

Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler() );
1 голос
/ 05 июня 2011
try {
  // do something
   methodWithException();
}
catch (Throwable t) {
   showMessage(t);
}

}//end business method

private void showMessage(Throwable t){
  /* logging the stacktrace of exception
   * if it's a web application, you can handle eh message in an Object: es in Struts you can use ActionError
  * il it's a deskotp app, you can show a popup
  * etc., etc.
  */

}

0 голосов
/ 05 июня 2011

Вы можете обернуть каждый метод, который может бросить в попытку поймать

или использовать getStackTrace()

catch (Throwable t) {
    StackTraceElement[] trace = t.getStackTrace();
    //trace[trace.length-1].getMethodName() should contain the method name inside the try
}

Кстати, бросание в броске не рекомендуется

0 голосов
/ 05 июня 2011

Показать дружеское сообщение из блока catch.

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