java-未捕获异常的处理,Java未捕获全局异常处理程序

I have an application and need to code a custom global uncaught exception handler. I've read all the stackoverflow threads and each one of them is just missing a clear and simple example of how this is to be implemented.

Consider this simple following example:

public static void log(String msg) throws Exception {

String logPath = "/application/logs/java.log";

Calendar c = new GregorianCalendar();

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String now = format.format(c.getTime());

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(logPath, true)));

out.println(now + " " + msg);

out.close();

}

It throws a standard exception which is just a standard output. How do I implement my own exception which overrides the standard one by something simple as outputing the error into a log file? Obviously the actual application is much larger and we're talking about uncaught exceptions, which is why try/catch blocks is not the option.

UPDATE: If you could please answer with a very clear full example, because I found dozens of examples like the one @RamonBoza provided, yet I have no idea how to implement them, which is what this question is all about.

UPDATE2: So I've tried to test the only example in the answer below, it obviously doesn't work. I've created a new class file "MyRunnable" and pasted the code in it:

package mypackage;

Thread t = new Thread(new MyRunnable());

t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

public void uncaughtException(Thread t, Throwable e) {

LOGGER.error(t + " throws exception: " + e);

}

});

t.start();

//outside that class

class MyRunnable implements Runnable(){

public void run(){

throw new RuntimeException("hey you!");

}

}

Needless to say I get a bunch of errors with this. How can something be outside of class anyway?

UPDATE3: This is the solution that finally works:

package mypackage;

public class MyClass {

public static void main(String[] args) throws Exception {

Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

public void uncaughtException(Thread t, Throwable e) {

StringWriter sw = new StringWriter();

e.printStackTrace(new PrintWriter(sw));

String stacktrace = sw.toString();

System.out.println(stacktrace);

}

});

//main method code

}

//Rest of the methods here

}

解决方案

You can set UncaughtExceptionHandler for the thread controlling the code above:

// t is the parent code thread

t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

public void uncaughtException(Thread t, Throwable e) {

LOGGER.error(t + " throws exception: " + e);

}

});

When a thread is about to terminate due to an uncaught exception the

Java Virtual Machine will query the thread for its

UncaughtExceptionHandler using Thread.getUncaughtExceptionHandler()

and will invoke the handler's uncaughtException method, passing the

thread and the exception as arguments

the setUncaughtExceptionHandler is commonly used to free memory or kill threads that the system will not be able to kill, and perhaps, remain zombie.

A real example:

Thread t = new Thread(new MyRunnable());

t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

public void uncaughtException(Thread t, Throwable e) {

LOGGER.error(t + " throws exception: " + e);

}

});

t.start();

//outside that class

class MyRunnable implements Runnable(){

public void run(){

throw new RuntimeException("hey you!");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值