У меня есть приложение и нужно закодировать собственный глобальный обработчик исключенных исключений. Я прочитал все потоки 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, но я понятия не имею, как их реализовать, что этот вопрос есть.
UPDATE2: Поэтому я попытался проверить единственный пример в ответе ниже, он явно не работает. Я создал новый файл класса "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!");
}
}
Излишне говорить, что я получаю кучу ошибок с этим. Как может быть что-то вне класса в любом случае?
UPDATE3: Это решение, которое в конечном итоге работает:
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
}