| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed 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 com.android.dex.util; |
| |
| import java.io.PrintStream; |
| import java.io.PrintWriter; |
| |
| /** |
| * Exception which carries around structured context. |
| */ |
| public class ExceptionWithContext extends RuntimeException { |
| /** {@code non-null;} human-oriented context of the exception */ |
| private StringBuffer context; |
| |
| /** |
| * Augments the given exception with the given context, and return the |
| * result. The result is either the given exception if it was an |
| * {@link ExceptionWithContext}, or a newly-constructed exception if it |
| * was not. |
| * |
| * @param ex {@code non-null;} the exception to augment |
| * @param str {@code non-null;} context to add |
| * @return {@code non-null;} an appropriate instance |
| */ |
| public static ExceptionWithContext withContext(Throwable ex, String str) { |
| ExceptionWithContext ewc; |
| |
| if (ex instanceof ExceptionWithContext) { |
| ewc = (ExceptionWithContext) ex; |
| } else { |
| ewc = new ExceptionWithContext(ex); |
| } |
| |
| ewc.addContext(str); |
| return ewc; |
| } |
| |
| /** |
| * Constructs an instance. |
| * |
| * @param message human-oriented message |
| */ |
| public ExceptionWithContext(String message) { |
| this(message, null); |
| } |
| |
| /** |
| * Constructs an instance. |
| * |
| * @param cause {@code null-ok;} exception that caused this one |
| */ |
| public ExceptionWithContext(Throwable cause) { |
| this(null, cause); |
| } |
| |
| /** |
| * Constructs an instance. |
| * |
| * @param message human-oriented message |
| * @param cause {@code null-ok;} exception that caused this one |
| */ |
| public ExceptionWithContext(String message, Throwable cause) { |
| super((message != null) ? message : |
| (cause != null) ? cause.getMessage() : null, |
| cause); |
| |
| if (cause instanceof ExceptionWithContext) { |
| String ctx = ((ExceptionWithContext) cause).context.toString(); |
| context = new StringBuffer(ctx.length() + 200); |
| context.append(ctx); |
| } else { |
| context = new StringBuffer(200); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public void printStackTrace(PrintStream out) { |
| super.printStackTrace(out); |
| out.println(context); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public void printStackTrace(PrintWriter out) { |
| super.printStackTrace(out); |
| out.println(context); |
| } |
| |
| /** |
| * Adds a line of context to this instance. |
| * |
| * @param str {@code non-null;} new context |
| */ |
| public void addContext(String str) { |
| if (str == null) { |
| throw new NullPointerException("str == null"); |
| } |
| |
| context.append(str); |
| if (!str.endsWith("\n")) { |
| context.append('\n'); |
| } |
| } |
| |
| /** |
| * Gets the context. |
| * |
| * @return {@code non-null;} the context |
| */ |
| public String getContext() { |
| return context.toString(); |
| } |
| |
| /** |
| * Prints the message and context. |
| * |
| * @param out {@code non-null;} where to print to |
| */ |
| public void printContext(PrintStream out) { |
| out.println(getMessage()); |
| out.print(context); |
| } |
| |
| /** |
| * Prints the message and context. |
| * |
| * @param out {@code non-null;} where to print to |
| */ |
| public void printContext(PrintWriter out) { |
| out.println(getMessage()); |
| out.print(context); |
| } |
| } |