org.jasig.portal.lang
Class ChainedRuntimeException

java.lang.Object
  extended by java.lang.Throwable
      extended by java.lang.Exception
          extended by java.lang.RuntimeException
              extended by org.jasig.portal.lang.ChainedRuntimeException
All Implemented Interfaces:
java.io.Serializable, ChainedThrowable

public class ChainedRuntimeException
extends java.lang.RuntimeException
implements ChainedThrowable

The ChainedRuntimeException class has facilities for exception chaining. Exceptions which extend this class inherit these facilities by implementing appropriate constructors.

Version:
"$Revision: 1.3 $"
Author:
Jan Nielsen
See Also:
Serialized Form

Field Summary
private  java.lang.Throwable mCause
          The chained exception which is the cause of this exception.
private  StackTrace[] mStackTrace
          Cache of the stack trace for the exception.
 
Constructor Summary
ChainedRuntimeException()
          Constructs an exception with no message and no cause.
ChainedRuntimeException(java.lang.String message)
          Constructs an exception with a message but no cause.
ChainedRuntimeException(java.lang.String message, java.lang.Throwable cause)
          Constructs a new exception instance with a message and a cause.
ChainedRuntimeException(java.lang.Throwable cause)
          Constructs a new exception instance with no message but a cause.
 
Method Summary
 java.lang.Throwable getCause()
          Returns the cause for this Throwable or null.
 java.lang.String getLocalizedMessage()
          Translate the error message to a locale specific error message.
private  StackTrace[] getOurStackTrace0()
          Returns an array of stack trace objects representing the current stack.
private  StackTrace[] getOurStackTraceInPre1_4()
          In a pre-1.4 JVM, create the stack trace elements by first constructing the normal error message and then removing the error message from the stream.
private  void initCause()
          Always null out the 1.4 cause to ensure serialized exceptions are properly reconstructed.
 void printStackTrace()
          Prints this throwable and its backtrace to the standard error stream.
 void printStackTrace(java.io.PrintStream stream)
          Prints this throwable and its backtrace to the specified print stream.
 void printStackTrace(java.io.PrintWriter stream)
          Prints this throwable and its backtrace to the specified print writer.
private  void printStackTraceAsCause(java.io.PrintStream stream, StackTrace[] causedTrace)
          Print our stack trace as a cause for the specified stack trace.
private  void printStackTraceAsCause(java.io.PrintWriter stream, StackTrace[] causedTrace)
          Print our stack trace as a cause for the specified stack trace.
 
Methods inherited from class java.lang.Throwable
fillInStackTrace, getMessage, getStackTrace, initCause, setStackTrace, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

mCause

private java.lang.Throwable mCause
The chained exception which is the cause of this exception.


mStackTrace

private StackTrace[] mStackTrace
Cache of the stack trace for the exception.

Constructor Detail

ChainedRuntimeException

public ChainedRuntimeException()
Constructs an exception with no message and no cause.


ChainedRuntimeException

public ChainedRuntimeException(java.lang.String message)
Constructs an exception with a message but no cause. The message should be an internationalized message.

Parameters:
message - exception message

ChainedRuntimeException

public ChainedRuntimeException(java.lang.Throwable cause)
Constructs a new exception instance with no message but a cause.

Parameters:
cause - underlying cause of the exception

ChainedRuntimeException

public ChainedRuntimeException(java.lang.String message,
                               java.lang.Throwable cause)
Constructs a new exception instance with a message and a cause. The message should be an internationalized message.

Parameters:
message - exception message
cause - underlying cause of the exception
Method Detail

getCause

public java.lang.Throwable getCause()
Returns the cause for this Throwable or null. The cause is mean for diagnostic purposes only; Clients should not try to use the cause for additional error handling since that would build an inappropriate subsystem dependency.

Overrides:
getCause in class java.lang.Throwable
Returns:
throwable associated with this object, or null if not set

getLocalizedMessage

public java.lang.String getLocalizedMessage()
Translate the error message to a locale specific error message.

Overrides:
getLocalizedMessage in class java.lang.Throwable
Returns:
localized error message

printStackTrace

public void printStackTrace()
Prints this throwable and its backtrace to the standard error stream. This method prints a stack trace for this Throwable object on the error output stream that is the value of the field System.err. The first line of output contains the result of the Throwable.toString() method for this object. Remaining lines represent data previously recorded by the method Throwable.fillInStackTrace(). The format of this information depends on the implementation, but the following example may be regarded as typical:

 java.lang.NullPointerException
         at MyClass.mash(MyClass.java:9)
         at MyClass.crunch(MyClass.java:6)
         at MyClass.main(MyClass.java:3)
 
This example was produced by running the program:

 class MyClass {
     public static void main(String[] args) {
         crunch(null);
     }
     static void crunch(int[] a) {
         mash(a);
     }
     static void mash(int[] b) {
         System.out.println(b[0]);
     }
 }
 
The backtrace for a throwable with an initialized, non-null cause should generally include the backtrace for the cause. The format of this information depends on the implementation, but the following example may be regarded as typical:

 HighLevelException: MidLevelException: LowLevelException
         at Junk.a(Junk.java:13)
         at Junk.main(Junk.java:4)
 Caused by: MidLevelException: LowLevelException
         at Junk.c(Junk.java:23)
         at Junk.b(Junk.java:17)
         at Junk.a(Junk.java:11)
         ... 1 more
 Caused by: LowLevelException
         at Junk.e(Junk.java:30)
         at Junk.d(Junk.java:27)
         at Junk.c(Junk.java:21)
         ... 3 more
 
Note the presence of lines containing the characters "...". These lines indicate that the remainder of the stack trace for this exception matches the indicated number of frames from the bottom of the stack trace of the exception that was caused by this exception (the "enclosing" exception). This shorthand can greatly reduce the length of the output in the common case where a wrapped exception is thrown from same method as the "causative exception" is caught. The above example was produced by running the program:

 public class Junk {
     public static void main(String args[]) {
         try {
             a();
         } catch(HighLevelException e) {
             e.printStackTrace();
         }
     }
     static void a() throws HighLevelException {
         try {
             b();
         } catch(MidLevelException e) {
             throw new HighLevelException(e);
         }
     }
     static void b() throws MidLevelException {
         c();
     }
     static void c() throws MidLevelException {
         try {
             d();
         } catch(LowLevelException e) {
             throw new MidLevelException(e);
         }
     }
     static void d() throws LowLevelException {
        e();
     }
     static void e() throws LowLevelException {
         throw new LowLevelException();
     }
 }

 class HighLevelException extends Exception {
     HighLevelException(Throwable cause) { super(cause); }
 }

 class MidLevelException extends Exception {
     MidLevelException(Throwable cause)  { super(cause); }
 }

 class LowLevelException extends Exception {
 }
 

Overrides:
printStackTrace in class java.lang.Throwable

printStackTrace

public void printStackTrace(java.io.PrintStream stream)
Prints this throwable and its backtrace to the specified print stream.

Overrides:
printStackTrace in class java.lang.Throwable
Parameters:
stream - PrintStream to use for output
Throws:
java.lang.NullPointerException - if stream is null

printStackTrace

public void printStackTrace(java.io.PrintWriter stream)
Prints this throwable and its backtrace to the specified print writer.

Overrides:
printStackTrace in class java.lang.Throwable
Parameters:
stream - PrintWriter to use for output
Throws:
java.lang.NullPointerException - if stream is null

getOurStackTrace0

private StackTrace[] getOurStackTrace0()
Returns an array of stack trace objects representing the current stack.

Returns:
array of stack trace elements

getOurStackTraceInPre1_4

private StackTrace[] getOurStackTraceInPre1_4()
In a pre-1.4 JVM, create the stack trace elements by first constructing the normal error message and then removing the error message from the stream.

Returns:
array of stack trace elements

initCause

private void initCause()
Always null out the 1.4 cause to ensure serialized exceptions are properly reconstructed.


printStackTraceAsCause

private void printStackTraceAsCause(java.io.PrintStream stream,
                                    StackTrace[] causedTrace)
Print our stack trace as a cause for the specified stack trace.

Parameters:
stream - stream to which stack trace should be written
causedTrace - stack trace to write to stream

printStackTraceAsCause

private void printStackTraceAsCause(java.io.PrintWriter stream,
                                    StackTrace[] causedTrace)
Print our stack trace as a cause for the specified stack trace.

Parameters:
stream - stream to which stack trace should be written
causedTrace - stack trace to write to stream