Исключения 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 ловить бросок не рекомендуется