org.jasig.portal.lang
Class ChainedError

java.lang.Object
  extended by java.lang.Throwable
      extended by java.lang.Error
          extended by org.jasig.portal.lang.ChainedError
All Implemented Interfaces:
java.io.Serializable, ChainedThrowable

public class ChainedError
extends java.lang.Error
implements ChainedThrowable

The ChainedError class has facilities for error chaining. Throwables 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 throwable which is the cause.
private  StackTrace[] mStackTrace
          Cache of the stack trace for the throwable.
 
Constructor Summary
ChainedError()
          Constructs an exception with no message and no cause.
ChainedError(java.lang.String message)
          Constructs an exception with a message but no cause.
ChainedError(java.lang.String message, java.lang.Throwable cause)
          Constructs a new exception instance with a message and a cause.
ChainedError(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 throwable which is the cause.


mStackTrace

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

Constructor Detail

ChainedError

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


ChainedError

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

Parameters:
message - exception message

ChainedError

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

Parameters:
cause - underlying cause of the exception

ChainedError

public ChainedError(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