Исключения Java - обработка исключений без try catch

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

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

}

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

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

Спасибо.

Ответы

Ответ 1

По умолчанию 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() );

Ответ 2

try {
  // do something
   methodWithException();
}
catch (Throwable t) {
   showMessage(t);
}

}//end business method

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

}

Ответ 3

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

Ответ 4

вы можете обернуть каждый метод, который может вызвать попытку catch

или используйте getStackTrace()

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

btw ловить бросок не рекомендуется