public String stackTraceToString(Throwable e) {StringBuilder sb = new StringBuilder();for (StackTraceElement element : e.getStackTrace()) {sb.append(element.toString());sb.append("\n");}return sb.toString();}
09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException09-24 16:09:07.042: I/System.out(4844): at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)09-24 16:09:07.042: I/System.out(4844): at android.app.Activity.performCreate(Activity.java:5248)09-24 16:09:07.043: I/System.out(4844): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.access$800(ActivityThread.java:139)09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)09-24 16:09:07.043: I/System.out(4844): at android.os.Handler.dispatchMessage(Handler.java:102)09-24 16:09:07.043: I/System.out(4844): at android.os.Looper.loop(Looper.java:136)09-24 16:09:07.044: I/System.out(4844): at android.app.ActivityThread.main(ActivityThread.java:5097)09-24 16:09:07.044: I/System.out(4844): at java.lang.reflect.Method.invokeNative(Native Method)09-24 16:09:07.044: I/System.out(4844): at java.lang.reflect.Method.invoke(Method.java:515)09-24 16:09:07.044: I/System.out(4844): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)09-24 16:09:07.044: I/System.out(4844): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
import java.io.StringWriter;import java.io.PrintWriter;
//Two lines of code to get the exception into a StringWriterStringWriter sw = new StringWriter();new Throwable().printStackTrace(new PrintWriter(sw));
//And to actually print itlogger.info("Current stack trace is:\n" + sw.toString());
catch (Exception e) {StackTraceElement[] stack = e.getStackTrace();String exception = "";for (StackTraceElement s : stack) {exception = exception + s.toString() + "\n\t\t";}System.out.println(exception);// then you can send the exception string to a external file.}
// This filters out this package and up.String packageNameToFilter = "org.springframework";
StringWriter sw = new StringWriter();PrintWriter pw = new SelectivePrintWriter(sw, packageNameToFilter);e.printStackTrace(pw);String sStackTrace = sw.toString();System.out.println(sStackTrace);
其中SelectivePrintWriter类由以下人员给出:
public class SelectivePrintWriter extends PrintWriter {private boolean on = true;private static final String AT = "\tat";private String internal;
public SelectivePrintWriter(Writer out, String packageOrClassName) {super(out);internal = "\tat " + packageOrClassName;}
public void println(Object obj) {if (obj instanceof String) {String txt = (String) obj;if (!txt.startsWith(AT)) on = true;else if (txt.startsWith(internal)) on = false;if (on) super.println(txt);} else {super.println(obj);}}}
public void remove(List<String> ids) {if(ids == null || ids.isEmpty()) {LOG.warn("An empty list (or null) was passed to {}.remove(List). " +"Clearly, this call is unneccessary, the caller should " +"avoid making it. A stacktrace follows.",getClass().getName(),new Throwable ("Stacktrace"));
return;}
// actual work, remove stuff}
// ...
catch (Exception e){ByteArrayOutputStream out = new ByteArrayOutputStream();e.printStackTrace(new PrintStream(out));String str = new String(out.toByteArray());
System.out.println(str);}
/** @param stackTraceElements The elements to convert* @return The resulting string */public static final String stackTraceElementsToStr(StackTraceElement[] stackTraceElements) {return stackTraceElementsToStr(stackTraceElements, "\n");}
/** @param stackTraceElements The elements to convert* @param lineSeparator The line separator to use* @return The resulting string */public static final String stackTraceElementsToStr(StackTraceElement[] stackTraceElements, String lineSeparator) {return stackTraceElementsToStr(stackTraceElements, lineSeparator, "");}
/** @param stackTraceElements The elements to convert* @param lineSeparator The line separator to use* @param padding The string to be used at the start of each line* @return The resulting string */public static final String stackTraceElementsToStr(StackTraceElement[] stackTraceElements, String lineSeparator, String padding) {String str = "";if(stackTraceElements != null) {for(StackTraceElement stackTrace : stackTraceElements) {str += padding + (!stackTrace.toString().startsWith("Caused By") ? "\tat " : "") + stackTrace.toString() + lineSeparator;}}return str;}
/** @param stackTraceElements The elements to convert* @return The resulting string */public static final String stackTraceCausedByElementsOnlyToStr(StackTraceElement[] stackTraceElements) {return stackTraceCausedByElementsOnlyToStr(stackTraceElements, "\n");}
/** @param stackTraceElements The elements to convert* @param lineSeparator The line separator to use* @return The resulting string */public static final String stackTraceCausedByElementsOnlyToStr(StackTraceElement[] stackTraceElements, String lineSeparator) {return stackTraceCausedByElementsOnlyToStr(stackTraceElements, lineSeparator, "");}
/** @param stackTraceElements The elements to convert* @param lineSeparator The line separator to use* @param padding The string to be used at the start of each line* @return The resulting string */public static final String stackTraceCausedByElementsOnlyToStr(StackTraceElement[] stackTraceElements, String lineSeparator, String padding) {String str = "";if(stackTraceElements != null) {for(StackTraceElement stackTrace : stackTraceElements) {str += (!stackTrace.toString().startsWith("Caused By") ? "" : padding + stackTrace.toString() + lineSeparator);}}return str;}
/** @param e The {@link Throwable} to convert* @return The resulting String */public static final String throwableToStrNoStackTraces(Throwable e) {return throwableToStrNoStackTraces(e, "\n");}
/** @param e The {@link Throwable} to convert* @param lineSeparator The line separator to use* @return The resulting String */public static final String throwableToStrNoStackTraces(Throwable e, String lineSeparator) {return throwableToStrNoStackTraces(e, lineSeparator, "");}
/** @param e The {@link Throwable} to convert* @param lineSeparator The line separator to use* @param padding The string to be used at the start of each line* @return The resulting String */public static final String throwableToStrNoStackTraces(Throwable e, String lineSeparator, String padding) {if(e == null) {return "null";}String str = e.getClass().getName() + ": ";if((e.getMessage() != null) && !e.getMessage().isEmpty()) {str += e.getMessage() + lineSeparator;} else {str += lineSeparator;}str += padding + stackTraceCausedByElementsOnlyToStr(e.getStackTrace(), lineSeparator, padding);for(Throwable suppressed : e.getSuppressed()) {str += padding + throwableToStrNoStackTraces(suppressed, lineSeparator, padding + "\t");}Throwable cause = e.getCause();while(cause != null) {str += padding + "Caused by:" + lineSeparator + throwableToStrNoStackTraces(e.getCause(), lineSeparator, padding);cause = cause.getCause();}return str;}
/** @param e The {@link Throwable} to convert* @return The resulting String */public static final String throwableToStr(Throwable e) {return throwableToStr(e, "\n");}
/** @param e The {@link Throwable} to convert* @param lineSeparator The line separator to use* @return The resulting String */public static final String throwableToStr(Throwable e, String lineSeparator) {return throwableToStr(e, lineSeparator, "");}
/** @param e The {@link Throwable} to convert* @param lineSeparator The line separator to use* @param padding The string to be used at the start of each line* @return The resulting String */public static final String throwableToStr(Throwable e, String lineSeparator, String padding) {if(e == null) {return "null";}String str = padding + e.getClass().getName() + ": ";if((e.getMessage() != null) && !e.getMessage().isEmpty()) {str += e.getMessage() + lineSeparator;} else {str += lineSeparator;}str += padding + stackTraceElementsToStr(e.getStackTrace(), lineSeparator, padding);for(Throwable suppressed : e.getSuppressed()) {str += padding + "Suppressed: " + throwableToStr(suppressed, lineSeparator, padding + "\t");}Throwable cause = e.getCause();while(cause != null) {str += padding + "Caused by:" + lineSeparator + throwableToStr(e.getCause(), lineSeparator, padding);cause = cause.getCause();}return str;}
示例:
try(InputStream in = new FileInputStream(file)) {...} catch(IOException e) {String exceptionToString = throwableToStr(e);someLoggingUtility.println(exceptionToString);...}
打印:
java.io.FileNotFoundException: C:\test.txt (The system cannot find the file specified)at java.io.FileInputStream.open0(Native Method)at java.io.FileInputStream.open(Unknown Source)at java.io.FileInputStream.<init>(Unknown Source)at com.gmail.br45entei.Example.main(Example.java:32)