| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.rocketmq.remoting.internal; |
| |
| import java.io.PrintWriter; |
| import java.io.StringWriter; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.StringTokenizer; |
| |
| public class ExceptionUtils { |
| |
| private static final String LINE_SEPARATOR = System.getProperty("line.separator"); |
| |
| /** |
| * <p>Produces a <code>List</code> of stack frames - the message |
| * is not included. Only the trace of the specified exception is |
| * returned, any caused by trace is stripped.</p> |
| * |
| * <p>This works in most cases - it will only fail if the exception |
| * message contains a line that starts with: |
| * <code>" at".</code></p> |
| * |
| * @param t is any throwable |
| * @return List of stack frames |
| */ |
| static List<String> getStackFrameList(final Throwable t) { |
| final String stackTrace = getStackTrace(t); |
| final String linebreak = LINE_SEPARATOR; |
| final StringTokenizer frames = new StringTokenizer(stackTrace, linebreak); |
| final List<String> list = new ArrayList<String>(); |
| boolean traceStarted = false; |
| while (frames.hasMoreTokens()) { |
| final String token = frames.nextToken(); |
| // Determine if the line starts with <whitespace>at |
| final int at = token.indexOf("at"); |
| if (at != -1 && token.substring(0, at).trim().isEmpty()) { |
| traceStarted = true; |
| list.add(token); |
| } else if (traceStarted) { |
| break; |
| } |
| } |
| return list; |
| } |
| |
| /** |
| * <p>Gets the stack trace from a Throwable as a String.</p> |
| * |
| * <p>The result of this method vary by JDK version as this method |
| * uses {@link Throwable#printStackTrace(java.io.PrintWriter)}. |
| * On JDK1.3 and earlier, the cause exception will not be shown |
| * unless the specified throwable alters printStackTrace.</p> |
| * |
| * @param throwable the <code>Throwable</code> to be examined |
| * @return the stack trace as generated by the exception's |
| * <code>printStackTrace(PrintWriter)</code> method |
| */ |
| public static String getStackTrace(final Throwable throwable) { |
| final StringWriter sw = new StringWriter(); |
| final PrintWriter pw = new PrintWriter(sw, true); |
| throwable.printStackTrace(pw); |
| return sw.getBuffer().toString(); |
| } |
| } |