我有一个应用程序,需要编写一个自定义的全局未捕获异常处理程序。我已经阅读了所有的stackoverflow线程,但它们都缺少一个清晰简单的实现示例。
考虑以下简单示例:
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();
}
它抛出一个标准异常,只是一个标准输出。我如何实现自己的异常,通过将错误输出到日志文件来覆盖标准异常?显然,实际应用程序要大得多,我们正在谈论未捕获的异常,这就是为什么try/catch块不是选项的原因。
更新:如果您能提供一个非常清晰的完整示例作为答案,那就太好了,因为我找到了数十个像@RamonBoza提供的示例,但我不知道如何实现它们,这就是这个问题的全部内容。
更新2:所以我尝试测试下面唯一的示例,显然它不起作用。我创建了一个新的类文件“ MyRunnable”并将代码粘贴到其中:
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!");
}
}
毫无疑问,我遇到了很多错误。但是,任何东西怎么可能在类的外面呢?
更新3: 这是最终可行的解决方案:
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
}
ThreadGroup
,如此处所述:http://stackoverflow.com/questions/33344294/java-uncaught-global-exception-handler-for-all-threads/33344392#33344392 - Benj