⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 magicexception.java

📁 基于数据库操作的封装
💻 JAVA
字号:
/*
 * Created on 2003-6-6
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package org.shaoye.magic;

import java.sql.SQLException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.LinkedList;
import java.util.StringTokenizer;

/**
 * The base class of all exceptions thrown by Magic.
 *
 * It is intended to ease the debugging by carrying on the information
 * about the exception which was caught and provoked throwing the 
 * current exception. Catching and rethrowing may occur multiple
 * times, and provided that all exceptions except the first one
 * are descendands of <code>ZotnException</code>, when the 
 * exception is finally printed out using any of the <code>
 * printStackTrace()</code> methods, the stacktrace will contain 
 * the information about all exceptions thrown and caught on
 * the way.
 * <p> Running the following program
 * <p>Yields the following stacktrace:
 * <p>
 *
 * @author ����ү
 * @version magic v1.0 2003-06-06
 */
public class MagicException extends SQLException {
	/** 
	 * Holds the reference to the exception or error that caused
	 * this exception to be thrown.
	 */
	private Throwable nested = null;

	/**
	 * Constructs a new <code>MagicException</code> without specified 
	 * detail message.
	 */
	public MagicException() {
		super();
	}

	/**
	 * Constructs a new <code>MagicException</code> with specified 
	 * detail message.
	 *
	 * @param msg The error message.
	 */
	public MagicException(String msg) {
		super(msg);
	}

	/**
	 * Constructs a new <code>MagicException</code> with specified 
	 * nested <code>Throwable</code>.
	 *
	 * @param nested The exception or error that caused this exception 
	 *               to be thrown.
	 */
	public MagicException(Throwable nested) {
		super();
		this.nested = nested;
	}

	/**
	 * Constructs a new <code>MagicException</code> with specified 
	 * detail message and nested <code>Throwable</code>.
	 *
	 * @param msg    The error message.
	 * @param nested The exception or error that caused this exception 
	 *               to be thrown.
	 */
	public MagicException(String msg, Throwable nested) {
		super(msg);
		this.nested = nested;
	}

	/**
	 * Returns the error message of this and any nested <code>Throwable</code>.
	 *
	 * @return The error message.
	 */
	public String getMessage() {
		StringBuffer msg = new StringBuffer();
		String ourMsg = super.getMessage();
		if (ourMsg != null) {
			msg.append(ourMsg);
		}
		if (nested != null) {
			String nestedMsg = nested.getMessage();
			if (nestedMsg != null) {
				if (ourMsg != null) {
					msg.append(": ");
				}
				msg.append(nestedMsg);
			}

		}
		return (msg.length() > 0 ? msg.toString() : null);
	}

	/**
	 * Prints the stack trace of this exception the the standar error 
	 * stream.
	 */
	public void printStackTrace() {
		synchronized (System.err) {
			printStackTrace(System.err);
		}
	}

	/**
	 * Prints the stack trace of this exception to the specified print stream.
	 *
	 * @param out <code>PrintStream</code> to use for output.
	 */
	public void printStackTrace(PrintStream out) {
		synchronized (out) {
			PrintWriter pw = new PrintWriter(out, false);
			printStackTrace(pw);
			// Flush the PrintWriter before it's GC'ed.
			pw.flush();
		}
	}

	/**
	 * Prints the stack trace of this exception to the specified print writer.
	 *
	 * @param out <code>PrintWriter</code> to use for output.
	 */
	public void printStackTrace(PrintWriter out) {
		synchronized (out) {
			printStackTrace(out, 0);
		}
	}

	/**
	 * Prints the stack trace of this exception skiping a specified number
	 * of stack frames.
	 *
	 * @param out  <code>PrintWriter</code> to use for output.
	 * @param skip The numbere of stack frames to skip.
	 */
	public void printStackTrace(PrintWriter out, int skip) {
		String[] st = captureStackTrace();
		if (nested != null) {
			if (nested instanceof MagicException) {
				((MagicException)nested).printStackTrace(out, st.length - 2);
			}
			else {
				String[] nst = captureStackTrace(nested);
				for (int i = 0; i < nst.length - st.length + 2; i++) {
					out.println(nst[i]);
				}
			}
			out.print("rethrown as ");
		}
		for (int i = 0; i < st.length - skip; i++) {
			out.println(st[i]);
		}
	}

	/**
	 * Captures the stack trace associated with this exception.
	 *
	 * @return an array of Strings describing stack frames.
	 */
	private String[] captureStackTrace() {
		StringWriter sw = new StringWriter();
		super.printStackTrace(new PrintWriter(sw, true));
		return splitStackTrace(sw.getBuffer().toString());
	}

	/**
	 * Captures the stack trace associated with a <code>Throwable</code> 
	 * object.
	 *
	 * @param t The <code>Throwable</code>.
	 * @return  An array of strings describing each stack frame.
	 */
	private String[] captureStackTrace(Throwable t) {
		StringWriter sw = new StringWriter();
		t.printStackTrace(new PrintWriter(sw, true));
		return splitStackTrace(sw.getBuffer().toString());
	}

	/**
	 * Splits the stack trace given as a newline separated string
	 * into an array of stack frames.
	 * 
	 * @param stackTrace The stack trace.
	 * @return           An array of strings describing each stack frame.
	 */
	private String[] splitStackTrace(String stackTrace) {
		String linebreak = System.getProperty("line.separator");
		StringTokenizer st = new StringTokenizer(stackTrace, linebreak);
		LinkedList list = new LinkedList();
		while (st.hasMoreTokens()) {
			list.add(st.nextToken());
		}
		return (String[])list.toArray();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -