在Java中,我们使用try catch块来处理异常。我知道我可以写一个像下面这样的 try catch 块来捕获方法中抛出的任何异常。
try {
// do something
}
catch (Throwable t) {
}
但是,在Java中有没有什么方法可以让我在异常发生时得到一个特定的方法被调用,而不是写一个像上面这样的全局性方法?
具体来说,我想在我的Swing应用程序中,当一个异常被抛出时,显示一个用户友好的消息(我的应用程序逻辑没有处理这个异常)。
谢谢。
默认情况下,JVM通过将堆栈跟踪打印到System.err流来处理未捕获的异常。Java允许我们通过提供我们自己的例程来定制这种行为,这些例程实现了以下功能。Thread.UncaughtExceptionHandler
接口。
请看一下我之前写的这篇博客文章,它详细解释了这个问题 ( http:/blog.yohanliyanage.com201009know-thejvm-1uncaught-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() );
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 the message in an Object: es in Struts you can use ActionError
* if it's a desktop app, you can show a popup
* etc., etc.
*/
}
在 catch
块。
你可以把每个方法都包在一个try catch中。
或使用 getStackTrace()
catch (Throwable t) {
StackTraceElement[] trace = t.getStackTrace();
//trace[trace.length-1].getMethodName() should contain the method name inside the try
}
顺便说一下,不建议接住可投掷的东西