Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java uncaught global exception handler

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  } 
like image 505
Caballero Avatar asked Oct 17 '13 09:10

Caballero


People also ask

What is global exception handler in Java?

The Global Exception Handler is a type of workflow designed to determine the project's behavior when encountering an execution error. Only one Global Exception Handler can be set per automation project.

How do you handle unhandled exception in Java?

The try-catch is the simplest method of handling exceptions. Put the code you want to run in the try block, and any Java exceptions that the code throws are caught by one or more catch blocks. This method will catch any type of Java exceptions that get thrown. This is the simplest mechanism for handling exceptions.

How do I use global exception handler in spring boot?

Exception Handler The @ExceptionHandler is an annotation used to handle the specific exceptions and sending the custom responses to the client. Define a class that extends the RuntimeException class. You can define the @ExceptionHandler method to handle the exceptions as shown.


1 Answers

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);     }  }); 

Java docs for UncaughtExceptionHandler -

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!");     } } 
like image 91
RamonBoza Avatar answered Oct 04 '22 11:10

RamonBoza