Class Throwables

java.lang.Object
com.google.common.base.Throwables

public final class Throwables extends Object
Static utility methods pertaining to instances of Throwable.

See the Guava User Guide entry on Throwables.

Since:
1.0
  • Field Details

    • JAVA_LANG_ACCESS_CLASSNAME

      private static final String JAVA_LANG_ACCESS_CLASSNAME
      JavaLangAccess class name to load using reflection
      See Also:
    • SHARED_SECRETS_CLASSNAME

      static final String SHARED_SECRETS_CLASSNAME
      SharedSecrets class name to load using reflection
      See Also:
    • jla

      @CheckForNull private static final Object jla
      Access to some fancy internal JVM internals.
    • getStackTraceElementMethod

      @CheckForNull private static final Method getStackTraceElementMethod
      The "getStackTraceElementMethod" method, only available on some JDKs so we use reflection to find it when available. When this is null, use the slow way.
    • getStackTraceDepthMethod

      @CheckForNull private static final Method getStackTraceDepthMethod
      The "getStackTraceDepth" method, only available on some JDKs so we use reflection to find it when available. When this is null, use the slow way.
  • Constructor Details

    • Throwables

      private Throwables()
  • Method Details

    • throwIfInstanceOf

      public static <X extends Throwable> void throwIfInstanceOf(Throwable throwable, Class<X> declaredType) throws X
      Throws throwable if it is an instance of declaredType. Example usage:
       for (Foo foo : foos) {
         try {
           foo.bar();
         } catch (BarException | RuntimeException | Error t) {
           failure = t;
         }
       }
       if (failure != null) {
         throwIfInstanceOf(failure, BarException.class);
         throwIfUnchecked(failure);
         throw new AssertionError(failure);
       }
       
      Throws:
      X
      Since:
      20.0
    • propagateIfInstanceOf

      @Deprecated public static <X extends Throwable> void propagateIfInstanceOf(@CheckForNull Throwable throwable, Class<X> declaredType) throws X
      Deprecated.
      Use throwIfInstanceOf(java.lang.Throwable, java.lang.Class<X>), which has the same behavior but rejects null.
      Propagates throwable exactly as-is, if and only if it is an instance of declaredType. Example usage:
       try {
         someMethodThatCouldThrowAnything();
       } catch (IKnowWhatToDoWithThisException e) {
         handle(e);
       } catch (Throwable t) {
         Throwables.propagateIfInstanceOf(t, IOException.class);
         Throwables.propagateIfInstanceOf(t, SQLException.class);
         throw Throwables.propagate(t);
       }
       
      Throws:
      X
    • throwIfUnchecked

      public static void throwIfUnchecked(Throwable throwable)
      Throws throwable if it is a RuntimeException or Error. Example usage:
       for (Foo foo : foos) {
         try {
           foo.bar();
         } catch (RuntimeException | Error t) {
           failure = t;
         }
       }
       if (failure != null) {
         throwIfUnchecked(failure);
         throw new AssertionError(failure);
       }
       
      Since:
      20.0
    • propagateIfPossible

      @Deprecated public static void propagateIfPossible(@CheckForNull Throwable throwable)
      Deprecated.
      Use throwIfUnchecked(java.lang.Throwable), which has the same behavior but rejects null.
      Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException or Error.
    • propagateIfPossible

      @Deprecated public static <X extends Throwable> void propagateIfPossible(@CheckForNull Throwable throwable, Class<X> declaredType) throws X
      Deprecated.
      Use a combination of throwIfInstanceOf(java.lang.Throwable, java.lang.Class<X>) and throwIfUnchecked(java.lang.Throwable), which togther provide the same behavior except that they reject null.
      Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException, Error, or declaredType.

      Discouraged in favor of calling throwIfInstanceOf(java.lang.Throwable, java.lang.Class<X>) and throwIfUnchecked(java.lang.Throwable).

      Parameters:
      throwable - the Throwable to possibly propagate
      declaredType - the single checked exception type declared by the calling method
      Throws:
      X
    • propagateIfPossible

      @Deprecated public static <X1 extends Throwable, X2 extends Throwable> void propagateIfPossible(@CheckForNull Throwable throwable, Class<X1> declaredType1, Class<X2> declaredType2) throws X1, X2
      Deprecated.
      Use a combination of two calls to throwIfInstanceOf(java.lang.Throwable, java.lang.Class<X>) and one call to throwIfUnchecked(java.lang.Throwable), which togther provide the same behavior except that they reject null.
      Propagates throwable exactly as-is, if and only if it is an instance of RuntimeException, Error, declaredType1, or declaredType2.
      Parameters:
      throwable - the Throwable to possibly propagate
      declaredType1 - any checked exception type declared by the calling method
      declaredType2 - any other checked exception type declared by the calling method
      Throws:
      X1
      X2
    • propagate

      @Deprecated public static RuntimeException propagate(Throwable throwable)
      Deprecated.
      To preserve behavior, use throw e or throw new RuntimeException(e) directly, or use a combination of throwIfUnchecked(java.lang.Throwable) and throw new RuntimeException(e). But consider whether users would be better off if your API threw a different type of exception. For background on the deprecation, read Why we deprecated Throwables.propagate.
      Propagates throwable as-is if it is an instance of RuntimeException or Error, or else as a last resort, wraps it in a RuntimeException and then propagates.

      This method always throws an exception. The RuntimeException return type allows client code to signal to the compiler that statements after the call are unreachable. Example usage:

       T doSomething() {
         try {
           return someMethodThatCouldThrowAnything();
         } catch (IKnowWhatToDoWithThisException e) {
           return handle(e);
         } catch (Throwable t) {
           throw Throwables.propagate(t);
         }
       }
       
      Parameters:
      throwable - the Throwable to propagate
      Returns:
      nothing will ever be returned; this return type is only for your convenience, as illustrated in the example above
    • getRootCause

      public static Throwable getRootCause(Throwable throwable)
      Returns the innermost cause of throwable. The first throwable in a chain provides context from when the error or exception was initially detected. Example usage:
       assertEquals("Unable to assign a customer id", Throwables.getRootCause(e).getMessage());
       
      Throws:
      IllegalArgumentException - if there is a loop in the causal chain
    • getCausalChain

      public static List<Throwable> getCausalChain(Throwable throwable)
      Gets a Throwable cause chain as a list. The first entry in the list will be throwable followed by its cause hierarchy. Note that this is a snapshot of the cause chain and will not reflect any subsequent changes to the cause chain.

      Here's an example of how it can be used to find specific types of exceptions in the cause chain:

       Iterables.filter(Throwables.getCausalChain(e), IOException.class));
       
      Parameters:
      throwable - the non-null Throwable to extract causes from
      Returns:
      an unmodifiable list containing the cause chain starting with throwable
      Throws:
      IllegalArgumentException - if there is a loop in the causal chain
    • getCauseAs

      @CheckForNull public static <X extends Throwable> X getCauseAs(Throwable throwable, Class<X> expectedCauseType)
      Returns throwable's cause, cast to expectedCauseType.

      Prefer this method instead of manually casting an exception's cause. For example, (IOException) e.getCause() throws a ClassCastException that discards the original exception e if the cause is not an IOException, but Throwables.getCauseAs(e, IOException.class) keeps e as the ClassCastException's cause.

      Throws:
      ClassCastException - if the cause cannot be cast to the expected type. The ClassCastException's cause is throwable.
      Since:
      22.0
    • getStackTraceAsString

      public static String getStackTraceAsString(Throwable throwable)
      Returns a string containing the result of toString(), followed by the full, recursive stack trace of throwable. Note that you probably should not be parsing the resulting string; if you need programmatic access to the stack frames, you can call Throwable.getStackTrace().
    • lazyStackTrace

      @Deprecated public static List<StackTraceElement> lazyStackTrace(Throwable throwable)
      Deprecated.
      This method is equivalent to Throwable.getStackTrace() on JDK versions past JDK 8 and on all Android versions. Use Throwable.getStackTrace() directly, or where possible use the java.lang.StackWalker.walk method introduced in JDK 9.
      Returns the stack trace of throwable, possibly providing slower iteration over the full trace but faster iteration over parts of the trace. Here, "slower" and "faster" are defined in comparison to the normal way to access the stack trace, throwable.getStackTrace(). Note, however, that this method's special implementation is not available for all platforms and configurations. If that implementation is unavailable, this method falls back to getStackTrace. Callers that require the special implementation can check its availability with lazyStackTraceIsLazy().

      The expected (but not guaranteed) performance of the special implementation differs from getStackTrace in one main way: The lazyStackTrace call itself returns quickly by delaying the per-stack-frame work until each element is accessed. Roughly speaking:

      • getStackTrace takes stackSize time to return but then negligible time to retrieve each element of the returned list.
      • lazyStackTrace takes negligible time to return but then 1/stackSize time to retrieve each element of the returned list (probably slightly more than 1/stackSize).

      Note: The special implementation does not respect calls to throwable.setStackTrace. Instead, it always reflects the original stack trace from the exception's creation.

      Since:
      19.0
    • lazyStackTraceIsLazy

      @Deprecated public static boolean lazyStackTraceIsLazy()
      Deprecated.
      This method always returns false on JDK versions past JDK 8 and on all Android versions.
      Returns whether lazyStackTrace(java.lang.Throwable) will use the special implementation described in its documentation.
      Since:
      19.0
    • jlaStackTrace

      private static List<StackTraceElement> jlaStackTrace(Throwable t)
    • invokeAccessibleNonThrowingMethod

      private static Object invokeAccessibleNonThrowingMethod(Method method, Object receiver, Object... params)
    • getJLA

      @CheckForNull private static Object getJLA()
      Returns the JavaLangAccess class that is present in all Sun JDKs. It is not allowed in AppEngine, and not present in non-Sun JDKs.
    • getGetMethod

      @CheckForNull private static Method getGetMethod()
      Returns the Method that can be used to resolve an individual StackTraceElement, or null if that method cannot be found (it is only to be found in fairly recent JDKs).
    • getSizeMethod

      @CheckForNull private static Method getSizeMethod(Object jla)
      Returns the Method that can be used to return the size of a stack, or null if that method cannot be found (it is only to be found in fairly recent JDKs). Tries to test method
      invalid reference
      getStackTraceDepth
      prior to return it (might fail some JDKs).

      See Throwables#lazyStackTrace throws UnsupportedOperationException.

    • getJlaMethod

      @CheckForNull private static Method getJlaMethod(String name, Class<?>... parameterTypes) throws ThreadDeath
      Throws:
      ThreadDeath