Mega Code Archive

 
Categories / Java / Language Basics
 

Exception Util

/*************************************************************************  *  * ADOBE CONFIDENTIAL  * __________________  *  *  Copyright 2002 - 2007 Adobe Systems Incorporated  *  All Rights Reserved.  *  * NOTICE:  All information contained herein is, and remains  * the property of Adobe Systems Incorporated and its suppliers,  * if any.  The intellectual and technical concepts contained  * herein are proprietary to Adobe Systems Incorporated  * and its suppliers and may be covered by U.S. and Foreign Patents,  * patents in process, and are protected by trade secret or copyright law.  * Dissemination of this information or reproduction of this material  * is strictly forbidden unless prior written permission is obtained  * from Adobe Systems Incorporated.  **************************************************************************/ //package flex.messaging.util; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.NoSuchElementException; import java.util.StringTokenizer; /**  * @exclude  */ public class ExceptionUtil {   /**    * List of no-arg methods that are known to return a wrapped throwable.    **/   public static String[] unwrapMethods = { "getRootCause",       "getTargetException", "getTargetError", "getException",       "getCausedByException", "getLinkedException" };   public static Throwable wrappedException(Throwable t) {     // Handle these statically since they are core to Java     return (t instanceof InvocationTargetException) ? ((InvocationTargetException) t)         .getTargetException() : getRootCauseWithReflection(t);   }   /**    * Get to the base exception (if any).    */   public static Throwable baseException(Throwable t) {     Throwable wrapped = wrappedException(t);     return wrapped != null ? baseException(wrapped) : t;   }   /**    * Return the stack trace in a String.    */   public static String toString(Throwable t) {     StringWriter strWrt = new StringWriter();     t.printStackTrace(new PrintWriter(strWrt));     return strWrt.toString();   }   /**    * Return the stack trace up to the first line that starts with prefix.    *     * <p>    * Example: ExceptionUtil.getStackTraceUpTo(exception, "jrunx.");    * </p>    */   public static String getStackTraceUpTo(Throwable t, String prefix) {     StringTokenizer tokens = new StringTokenizer(toString(t), "\n\r");     StringBuffer trace = new StringBuffer();     boolean done = false;     String lookingFor = "at " + prefix;     while (!done && tokens.hasMoreElements()) {       String token = tokens.nextToken();       if (token.indexOf(lookingFor) == -1)         trace.append(token);       else         done = true;       trace.append("\n");     }     return trace.toString();   }   /**    * return the top n lines of this stack trace.    *     * <p>    * Example: ExceptionUtil.getStackTraceLines(exception, 10);    * </p>    */   public static String getStackTraceLines(Throwable t, int numLines) {     StringTokenizer tokens = new StringTokenizer(toString(t), "\n\r");     StringBuffer trace = new StringBuffer();     for (int i = 0; i < numLines; i++) {       String token = tokens.nextToken();       trace.append(token);       trace.append("\n");     }     return trace.toString();   }   /**    * Return the "nth" method call from the stack trace of "t", where 0 is the    * top.    */   public static String getCallAt(Throwable t, int nth) {     StringTokenizer tokens = new StringTokenizer(toString(t), "\n\r");     try {       // Skip the first line - the exception message       for (int i = 0; i <= nth; ++i)         tokens.nextToken();       // get the method name from the next token       String token = tokens.nextToken();       int index1 = token.indexOf(' ');       int index2 = token.indexOf('(');       StringBuffer call = new StringBuffer();       call.append(token.substring(index1 < 0 ? 0 : index1 + 1,           index2 < 0 ? call.length() : index2));       int index3 = token.indexOf(':', index2 < 0 ? 0 : index2);       if (index3 >= 0) {         int index4 = token.indexOf(')', index3);         call.append(token.substring(index3, index4 < 0 ? token.length()             : index4));       }       return call.toString();     } catch (NoSuchElementException e) {     }     return "unknown";   }   /**    * Utility method for converting an exception into a string. This method    * unwinds all wrapped exceptions    *     * @param t    *            The throwable exception    * @return The printable exception    */   public static String exceptionToString(Throwable t) {     StringWriter sw = new StringWriter();     PrintWriter out = new PrintWriter(sw);     // print out the exception stack.     printExceptionStack(t, out, 0);     return sw.toString();   }   /**    * Utility method for converting an exception and all chained root causes    * into a string. Unlike <code>exceptionToString(Throwable)</code> which    * prints the chain from most nested root cause down to the top-level    * exception, this method prints from the top-level exception down to the    * most nested root cause.    *     * @param t    *            The throwable exception.    * @return The printable exception.    */   public static String exceptionFollowedByRootCausesToString(Throwable t) {     StringBuffer output = new StringBuffer();     Throwable root = t;     while (root != null) {       output.append((root == t) ? ((root instanceof Exception) ? "  Exception: "           : "  Error: ")           : "  Root cause: ");       output.append(ExceptionUtil.toString(root));       // Do not recurse if the root cause has already been printed; this       // will have happened if the root cause has       // been assigned to the current Throwable via initCause() or as a       // constructor argument.       Throwable cause = root.getCause();       root = ExceptionUtil.wrappedException(root);       if (cause == root)         break;     }     return output.toString();   }   /**    * Recursively prints out a stack of wrapped exceptions.    */   protected static void printExceptionStack(Throwable th, PrintWriter out,       int depth) {     // only print the stack depth if the depth is greater than 0     boolean printStackDepth = depth > 0;     Throwable wrappedException = ExceptionUtil.wrappedException(th);     if (wrappedException != null) {       printStackDepth = true;       printExceptionStack(wrappedException, out, depth + 1);     }     if (printStackDepth) {       out.write("[" + depth + "]");     }     th.printStackTrace(out);   }   private static Throwable getRootCauseWithReflection(Throwable t) {     for (int i = 0; i < unwrapMethods.length; i++) {       Method m = null;       try {         m = t.getClass().getMethod(unwrapMethods[i], (Class[]) null);         return (Throwable) m.invoke(t, (Object[]) null);       } catch (Exception nsme) {         // ignore       }     }     return null;   } }