public class ExceptionUtils
extends java.lang.Object
Provides utilities for manipulating and examining
Throwable
objects.
Modifier and Type | Field and Description |
---|---|
private static java.lang.String[] |
CAUSE_METHOD_NAMES
The names of methods commonly used to access a wrapped exception.
|
private static java.lang.Object |
CAUSE_METHOD_NAMES_LOCK |
private static java.lang.reflect.Method |
THROWABLE_CAUSE_METHOD
The Method object for Java 1.4 getCause.
|
private static java.lang.reflect.Method |
THROWABLE_INITCAUSE_METHOD
The Method object for Java 1.4 initCause.
|
(package private) static java.lang.String |
WRAPPED_MARKER
Used when printing stack frames to denote the start of a
wrapped exception.
|
Constructor and Description |
---|
ExceptionUtils()
Public constructor allows an instance of
ExceptionUtils to be created, although that is not
normally necessary. |
Modifier and Type | Method and Description |
---|---|
static void |
addCauseMethodName(java.lang.String methodName)
Adds to the list of method names used in the search for
Throwable
objects. |
static java.lang.Throwable |
getCause(java.lang.Throwable throwable)
Introspects the
Throwable to obtain the cause. |
static java.lang.Throwable |
getCause(java.lang.Throwable throwable,
java.lang.String[] methodNames)
Introspects the
Throwable to obtain the cause. |
private static java.util.ArrayList |
getCauseMethodNameList()
Returns
CAUSE_METHOD_NAMES as a List. |
private static java.lang.Throwable |
getCauseUsingFieldName(java.lang.Throwable throwable,
java.lang.String fieldName)
Finds a
Throwable by field name. |
private static java.lang.Throwable |
getCauseUsingMethodName(java.lang.Throwable throwable,
java.lang.String methodName)
Finds a
Throwable by method name. |
private static java.lang.Throwable |
getCauseUsingWellKnownTypes(java.lang.Throwable throwable)
Finds a
Throwable for known types. |
static java.lang.String |
getFullStackTrace(java.lang.Throwable throwable)
A way to get the entire nested stack-trace of an throwable.
|
static java.lang.String |
getMessage(java.lang.Throwable th)
Gets a short message summarising the exception.
|
static java.lang.Throwable |
getRootCause(java.lang.Throwable throwable)
Introspects the
Throwable to obtain the root cause. |
static java.lang.String |
getRootCauseMessage(java.lang.Throwable th)
Gets a short message summarising the root cause exception.
|
static java.lang.String[] |
getRootCauseStackTrace(java.lang.Throwable throwable)
Creates a compact stack trace for the root cause of the supplied
Throwable . |
(package private) static java.util.List |
getStackFrameList(java.lang.Throwable t)
Produces a
List of stack frames - the message
is not included. |
(package private) static java.lang.String[] |
getStackFrames(java.lang.String stackTrace)
Returns an array where each element is a line from the argument.
|
static java.lang.String[] |
getStackFrames(java.lang.Throwable throwable)
Captures the stack trace associated with the specified
Throwable object, decomposing it into a list of
stack frames. |
static java.lang.String |
getStackTrace(java.lang.Throwable throwable)
Gets the stack trace from a Throwable as a String.
|
static int |
getThrowableCount(java.lang.Throwable throwable)
Counts the number of
Throwable objects in the
exception chain. |
static java.util.List |
getThrowableList(java.lang.Throwable throwable)
Returns the list of
Throwable objects in the
exception chain. |
static java.lang.Throwable[] |
getThrowables(java.lang.Throwable throwable)
Returns the list of
Throwable objects in the
exception chain. |
private static int |
indexOf(java.lang.Throwable throwable,
java.lang.Class type,
int fromIndex,
boolean subclass)
Worker method for the
indexOfType methods. |
static int |
indexOfThrowable(java.lang.Throwable throwable,
java.lang.Class clazz)
Returns the (zero based) index of the first
Throwable
that matches the specified class (exactly) in the exception chain. |
static int |
indexOfThrowable(java.lang.Throwable throwable,
java.lang.Class clazz,
int fromIndex)
Returns the (zero based) index of the first
Throwable
that matches the specified type in the exception chain from
a specified index. |
static int |
indexOfType(java.lang.Throwable throwable,
java.lang.Class type)
Returns the (zero based) index of the first
Throwable
that matches the specified class or subclass in the exception chain. |
static int |
indexOfType(java.lang.Throwable throwable,
java.lang.Class type,
int fromIndex)
Returns the (zero based) index of the first
Throwable
that matches the specified type in the exception chain from
a specified index. |
static boolean |
isCauseMethodName(java.lang.String methodName)
Tests if the list of method names used in the search for
Throwable
objects include the given name. |
static boolean |
isNestedThrowable(java.lang.Throwable throwable)
Checks whether this
Throwable class can store a cause. |
static boolean |
isThrowableNested()
Checks if the Throwable class has a
getCause method. |
static void |
printRootCauseStackTrace(java.lang.Throwable throwable)
Prints a compact stack trace for the root cause of a throwable
to
System.err . |
static void |
printRootCauseStackTrace(java.lang.Throwable throwable,
java.io.PrintStream stream)
Prints a compact stack trace for the root cause of a throwable.
|
static void |
printRootCauseStackTrace(java.lang.Throwable throwable,
java.io.PrintWriter writer)
Prints a compact stack trace for the root cause of a throwable.
|
static void |
removeCauseMethodName(java.lang.String methodName)
Removes from the list of method names used in the search for
Throwable
objects. |
static void |
removeCommonFrames(java.util.List causeFrames,
java.util.List wrapperFrames)
Removes common frames from the cause trace given the two stack traces.
|
static boolean |
setCause(java.lang.Throwable target,
java.lang.Throwable cause)
Sets the cause of a
Throwable using introspection, allowing
source code compatibility between pre-1.4 and post-1.4 Java releases. |
private static java.lang.String[] |
toArray(java.util.List list)
Returns the given list as a
String[] . |
static final java.lang.String WRAPPED_MARKER
Used when printing stack frames to denote the start of a wrapped exception.
Package private for accessibility by test suite.
private static final java.lang.Object CAUSE_METHOD_NAMES_LOCK
private static java.lang.String[] CAUSE_METHOD_NAMES
The names of methods commonly used to access a wrapped exception.
private static final java.lang.reflect.Method THROWABLE_CAUSE_METHOD
The Method object for Java 1.4 getCause.
private static final java.lang.reflect.Method THROWABLE_INITCAUSE_METHOD
The Method object for Java 1.4 initCause.
public ExceptionUtils()
Public constructor allows an instance of ExceptionUtils
to be created, although that is not
normally necessary.
public static void addCauseMethodName(java.lang.String methodName)
Adds to the list of method names used in the search for Throwable
objects.
methodName
- the methodName to add to the list, null
and empty strings are ignoredpublic static void removeCauseMethodName(java.lang.String methodName)
Removes from the list of method names used in the search for Throwable
objects.
methodName
- the methodName to remove from the list, null
and empty strings are ignoredpublic static boolean setCause(java.lang.Throwable target, java.lang.Throwable cause)
Sets the cause of a Throwable
using introspection, allowing
source code compatibility between pre-1.4 and post-1.4 Java releases.
The typical use of this method is inside a constructor as in the following example:
import org.apache.commons.lang.exception.ExceptionUtils; public class MyException extends Exception { public MyException(String msg) { super(msg); } public MyException(String msg, Throwable cause) { super(msg); ExceptionUtils.setCause(this, cause); } }
target
- the target Throwable
cause
- the Throwable
to set in the targettrue
if the target has been modifiedprivate static java.lang.String[] toArray(java.util.List list)
String[]
.list
- a list to transform.String[]
.private static java.util.ArrayList getCauseMethodNameList()
CAUSE_METHOD_NAMES
as a List.CAUSE_METHOD_NAMES
as a List.public static boolean isCauseMethodName(java.lang.String methodName)
Tests if the list of method names used in the search for Throwable
objects include the given name.
methodName
- the methodName to search in the list.Throwable
objects include the given name.public static java.lang.Throwable getCause(java.lang.Throwable throwable)
Introspects the Throwable
to obtain the cause.
The method searches for methods with specific names that return a
Throwable
object. This will pick up most wrapping exceptions,
including those from JDK 1.4, and
NestableException
.
The method names can be added to using addCauseMethodName(String)
.
The default list searched for are:
getCause()
getNextException()
getTargetException()
getException()
getSourceException()
getRootCause()
getCausedByException()
getNested()
In the absence of any such method, the object is inspected for a
detail
field assignable to a Throwable
.
If none of the above is found, returns null
.
throwable
- the throwable to introspect for a cause, may be nullThrowable
,
null
if none found or null throwable inputpublic static java.lang.Throwable getCause(java.lang.Throwable throwable, java.lang.String[] methodNames)
Introspects the Throwable
to obtain the cause.
A null
set of method names means use the default set.
A null
in the set of method names will be ignored.
throwable
- the throwable to introspect for a cause, may be nullmethodNames
- the method names, null treated as default setThrowable
,
null
if none found or null throwable inputpublic static java.lang.Throwable getRootCause(java.lang.Throwable throwable)
Introspects the Throwable
to obtain the root cause.
This method walks through the exception chain to the last element,
"root" of the tree, using getCause(Throwable)
, and
returns that exception.
From version 2.2, this method handles recursive cause structures that might otherwise cause infinite loops. If the throwable parameter has a cause of itself, then null will be returned. If the throwable parameter cause chain loops, the last element in the chain before the loop is returned.
throwable
- the throwable to get the root cause for, may be nullThrowable
,
null
if none found or null throwable inputprivate static java.lang.Throwable getCauseUsingWellKnownTypes(java.lang.Throwable throwable)
Finds a Throwable
for known types.
Uses instanceof
checks to examine the exception,
looking for well known types which could contain chained or
wrapped exceptions.
throwable
- the exception to examinenull
if not foundprivate static java.lang.Throwable getCauseUsingMethodName(java.lang.Throwable throwable, java.lang.String methodName)
Finds a Throwable
by method name.
throwable
- the exception to examinemethodName
- the name of the method to find and invokenull
if not foundprivate static java.lang.Throwable getCauseUsingFieldName(java.lang.Throwable throwable, java.lang.String fieldName)
Finds a Throwable
by field name.
throwable
- the exception to examinefieldName
- the name of the attribute to examinenull
if not foundpublic static boolean isThrowableNested()
Checks if the Throwable class has a getCause
method.
This is true for JDK 1.4 and above.
public static boolean isNestedThrowable(java.lang.Throwable throwable)
Checks whether this Throwable
class can store a cause.
This method does not check whether it actually does store a cause.
throwable
- the Throwable
to examine, may be nulltrue
if nested otherwise false
public static int getThrowableCount(java.lang.Throwable throwable)
Counts the number of Throwable
objects in the
exception chain.
A throwable without cause will return 1
.
A throwable with one cause will return 2
and so on.
A null
throwable will return 0
.
From version 2.2, this method handles recursive cause structures that might otherwise cause infinite loops. The cause chain is processed until the end is reached, or until the next item in the chain is already in the result set.
throwable
- the throwable to inspect, may be nullpublic static java.lang.Throwable[] getThrowables(java.lang.Throwable throwable)
Returns the list of Throwable
objects in the
exception chain.
A throwable without cause will return an array containing
one element - the input throwable.
A throwable with one cause will return an array containing
two elements. - the input throwable and the cause throwable.
A null
throwable will return an array of size zero.
From version 2.2, this method handles recursive cause structures that might otherwise cause infinite loops. The cause chain is processed until the end is reached, or until the next item in the chain is already in the result set.
throwable
- the throwable to inspect, may be nullgetThrowableList(Throwable)
public static java.util.List getThrowableList(java.lang.Throwable throwable)
Returns the list of Throwable
objects in the
exception chain.
A throwable without cause will return a list containing
one element - the input throwable.
A throwable with one cause will return a list containing
two elements. - the input throwable and the cause throwable.
A null
throwable will return a list of size zero.
This method handles recursive cause structures that might otherwise cause infinite loops. The cause chain is processed until the end is reached, or until the next item in the chain is already in the result set.
throwable
- the throwable to inspect, may be nullpublic static int indexOfThrowable(java.lang.Throwable throwable, java.lang.Class clazz)
Returns the (zero based) index of the first Throwable
that matches the specified class (exactly) in the exception chain.
Subclasses of the specified class do not match - see
indexOfType(Throwable, Class)
for the opposite.
A null
throwable returns -1
.
A null
type returns -1
.
No match in the chain returns -1
.
throwable
- the throwable to inspect, may be nullclazz
- the class to search for, subclasses do not match, null returns -1public static int indexOfThrowable(java.lang.Throwable throwable, java.lang.Class clazz, int fromIndex)
Returns the (zero based) index of the first Throwable
that matches the specified type in the exception chain from
a specified index.
Subclasses of the specified class do not match - see
indexOfType(Throwable, Class, int)
for the opposite.
A null
throwable returns -1
.
A null
type returns -1
.
No match in the chain returns -1
.
A negative start index is treated as zero.
A start index greater than the number of throwables returns -1
.
throwable
- the throwable to inspect, may be nullclazz
- the class to search for, subclasses do not match, null returns -1fromIndex
- the (zero based) index of the starting position,
negative treated as zero, larger than chain size returns -1public static int indexOfType(java.lang.Throwable throwable, java.lang.Class type)
Returns the (zero based) index of the first Throwable
that matches the specified class or subclass in the exception chain.
Subclasses of the specified class do match - see
indexOfThrowable(Throwable, Class)
for the opposite.
A null
throwable returns -1
.
A null
type returns -1
.
No match in the chain returns -1
.
throwable
- the throwable to inspect, may be nulltype
- the type to search for, subclasses match, null returns -1public static int indexOfType(java.lang.Throwable throwable, java.lang.Class type, int fromIndex)
Returns the (zero based) index of the first Throwable
that matches the specified type in the exception chain from
a specified index.
Subclasses of the specified class do match - see
indexOfThrowable(Throwable, Class)
for the opposite.
A null
throwable returns -1
.
A null
type returns -1
.
No match in the chain returns -1
.
A negative start index is treated as zero.
A start index greater than the number of throwables returns -1
.
throwable
- the throwable to inspect, may be nulltype
- the type to search for, subclasses match, null returns -1fromIndex
- the (zero based) index of the starting position,
negative treated as zero, larger than chain size returns -1private static int indexOf(java.lang.Throwable throwable, java.lang.Class type, int fromIndex, boolean subclass)
Worker method for the indexOfType
methods.
throwable
- the throwable to inspect, may be nulltype
- the type to search for, subclasses match, null returns -1fromIndex
- the (zero based) index of the starting position,
negative treated as zero, larger than chain size returns -1subclass
- if true
, compares with Class.isAssignableFrom(Class)
, otherwise compares
using referencestype
within throwables nested withing the specified throwable
public static void printRootCauseStackTrace(java.lang.Throwable throwable)
Prints a compact stack trace for the root cause of a throwable
to System.err
.
The compact stack trace starts with the root cause and prints stack frames up to the place where it was caught and wrapped. Then it prints the wrapped exception and continues with stack frames until the wrapper exception is caught and wrapped again, etc.
The output of this method is consistent across JDK versions. Note that this is the opposite order to the JDK1.4 display.
The method is equivalent to printStackTrace
for throwables
that don't have nested causes.
throwable
- the throwable to outputpublic static void printRootCauseStackTrace(java.lang.Throwable throwable, java.io.PrintStream stream)
Prints a compact stack trace for the root cause of a throwable.
The compact stack trace starts with the root cause and prints stack frames up to the place where it was caught and wrapped. Then it prints the wrapped exception and continues with stack frames until the wrapper exception is caught and wrapped again, etc.
The output of this method is consistent across JDK versions. Note that this is the opposite order to the JDK1.4 display.
The method is equivalent to printStackTrace
for throwables
that don't have nested causes.
throwable
- the throwable to output, may be nullstream
- the stream to output to, may not be nulljava.lang.IllegalArgumentException
- if the stream is null
public static void printRootCauseStackTrace(java.lang.Throwable throwable, java.io.PrintWriter writer)
Prints a compact stack trace for the root cause of a throwable.
The compact stack trace starts with the root cause and prints stack frames up to the place where it was caught and wrapped. Then it prints the wrapped exception and continues with stack frames until the wrapper exception is caught and wrapped again, etc.
The output of this method is consistent across JDK versions. Note that this is the opposite order to the JDK1.4 display.
The method is equivalent to printStackTrace
for throwables
that don't have nested causes.
throwable
- the throwable to output, may be nullwriter
- the writer to output to, may not be nulljava.lang.IllegalArgumentException
- if the writer is null
public static java.lang.String[] getRootCauseStackTrace(java.lang.Throwable throwable)
Creates a compact stack trace for the root cause of the supplied
Throwable
.
The output of this method is consistent across JDK versions. It consists of the root exception followed by each of its wrapping exceptions separated by '[wrapped]'. Note that this is the opposite order to the JDK1.4 display.
throwable
- the throwable to examine, may be nullpublic static void removeCommonFrames(java.util.List causeFrames, java.util.List wrapperFrames)
Removes common frames from the cause trace given the two stack traces.
causeFrames
- stack trace of a cause throwablewrapperFrames
- stack trace of a wrapper throwablejava.lang.IllegalArgumentException
- if either argument is nullpublic static java.lang.String getFullStackTrace(java.lang.Throwable throwable)
A way to get the entire nested stack-trace of an throwable.
The result of this method is highly dependent on the JDK version and whether the exceptions override printStackTrace or not.
throwable
- the Throwable
to be examinedpublic static java.lang.String getStackTrace(java.lang.Throwable throwable)
Gets the stack trace from a Throwable as a String.
The result of this method vary by JDK version as this method
uses Throwable.printStackTrace(java.io.PrintWriter)
.
On JDK1.3 and earlier, the cause exception will not be shown
unless the specified throwable alters printStackTrace.
throwable
- the Throwable
to be examinedprintStackTrace(PrintWriter)
methodpublic static java.lang.String[] getStackFrames(java.lang.Throwable throwable)
Captures the stack trace associated with the specified
Throwable
object, decomposing it into a list of
stack frames.
The result of this method vary by JDK version as this method
uses Throwable.printStackTrace(java.io.PrintWriter)
.
On JDK1.3 and earlier, the cause exception will not be shown
unless the specified throwable alters printStackTrace.
throwable
- the Throwable
to examine, may be nullstatic java.lang.String[] getStackFrames(java.lang.String stackTrace)
Returns an array where each element is a line from the argument.
The end of line is determined by the value of SystemUtils.LINE_SEPARATOR
.
Functionality shared between the
getStackFrames(Throwable)
methods of this and the
NestableDelegate
classes.
stackTrace
- a stack trace Stringstatic java.util.List getStackFrameList(java.lang.Throwable t)
Produces a List
of stack frames - the message
is not included. Only the trace of the specified exception is
returned, any caused by trace is stripped.
This works in most cases - it will only fail if the exception
message contains a line that starts with:
" at".
t
- is any throwablepublic static java.lang.String getMessage(java.lang.Throwable th)
The message returned is of the form {ClassNameWithoutPackage}: {ThrowableMessage}
th
- the throwable to get a message for, null returns empty stringpublic static java.lang.String getRootCauseMessage(java.lang.Throwable th)
The message returned is of the form {ClassNameWithoutPackage}: {ThrowableMessage}
th
- the throwable to get a message for, null returns empty string