October 08, 2014

How Exception objects are propagated between method calls before it reaches console as stacktrace

This post explains how Errors, Exceptions in java are propagated between method calls before the error stacktrace is print in console.

We can prevent Uncaught error stacktraces getting printed in console in Thread basis or ThreadGroup basis or all Thread basis.

 public class MyMain  
 {  
      public static void main(String[] args) {  
           // set UncaughtExceptionHandler for all threads.   
           Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler("default"));  
           // create custom ThreadGroup.  
           ThreadGroup tg = new MyThreadGroup("my-threadgroup");  
           Thread thread1 = new Thread(tg, new Runnable1());  
           Thread thread2 = new Thread(tg, new Runnable1());  
           // set UncaughtExceptionHandler specific to this thread.  
           thread2.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler("specific-to-thread2"));  
           Thread thread3 = new Thread(new Runnable1());  
           thread3.start();  
           thread2.start();  
           thread1.start();  
           throw new RuntimeException("from-Main");  
      }  
 }  
 class MyUncaughtExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler  
 {  
      String handlerName;  
      public MyUncaughtExceptionHandler(String name) {  
           this.handlerName = name;  
      }  
      public void uncaughtException(Thread t, Throwable e) {  
           System.err.println(handlerName + " Exception in thread: " + t.getName());  
           e.printStackTrace(System.err);  
      }  
 }  
 class Runnable1 implements Runnable  
 {  
      public void run() {  
           try {  
                Thread.sleep(3);   
           }  
           catch(InterruptedException e) {  
           }  
           throw new IllegalArgumentException();  
      }  
 }  
 class MyThreadGroup extends ThreadGroup  
 {  
      public MyThreadGroup(String groupName) {  
           super(groupName);  
      }  
      public void uncaughtException(Thread t, Throwable e) {  
           System.err.println("MyThreadGroup : Exception occurred in thread: " + t.getName());  
           e.printStackTrace(System.err);  
      }  
 }  



Output:
default Exception in thread: main
java.lang.RuntimeException: from-Main
at com.manageengine.apminsight.agent.threads.MyMain.main(MyMain.java:23)
default Exception in thread: Thread-3
java.lang.IllegalArgumentException
at com.manageengine.apminsight.agent.threads.Runnable1.run(MyMain.java:49)
at java.lang.Thread.run(Thread.java:695)
specific-to-thread2 Exception in thread: Thread-2
java.lang.IllegalArgumentException
at com.manageengine.apminsight.agent.threads.Runnable1.run(MyMain.java:49)
at java.lang.Thread.run(Thread.java:695)
MyThreadGroup : Exception occured in thread: Thread-1
java.lang.IllegalArgumentException
at com.manageengine.apminsight.agent.threads.Runnable1.run(MyMain.java:49)

 at java.lang.Thread.run(Thread.java:695)

No comments :

Post a Comment