view src/luan/LuaException.java @ 43:80b67b1a653c

implement string lib git-svn-id: https://luan-java.googlecode.com/svn/trunk@44 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 25 Dec 2012 03:42:42 +0000
parents 786699c78837
children 57054fa43189
line wrap: on
line source

package luan;


public class LuaException extends Exception {
	private final String stackTrace;

	public LuaException(LuaState lua,LuaElement el,Object msg) {
		super(message(msg),cause(msg));
		stackTrace = stackTrace(lua,el,msg);
	}

	@Override public String getMessage() {
		return super.getMessage() + stackTrace;
	}

	private String message() {
		return super.getMessage();
	}

	private static Throwable cause(Object msg) {
		return msg instanceof Throwable ? (Throwable)msg : null;
	}

	private static String message(Object msg) {
		if( msg instanceof LuaException ) {
			LuaException le = (LuaException)msg;
			return le.message();
		} else if( msg instanceof Throwable ) {
			Throwable t = (Throwable)msg;
			return t.getMessage();
		} else {
			return msg.toString();
		}
	}

	private static String stackTrace(LuaState lua,LuaElement el,Object msg) {
		StringBuilder buf = new StringBuilder();
		for( int i  = lua.stackTrace.size() - 1; i>=0; i-- ) {
			StackTraceElement stackTraceElement = lua.stackTrace.get(i);
			buf.append( "\n\t" ).append( el.toString(stackTraceElement.fnName) );
			el = stackTraceElement.call;
		}
		if( msg instanceof LuaException ) {
			LuaException le = (LuaException)msg;
			buf.append( "\ncaused by:" ).append( le.stackTrace );
		}
		return buf.toString();
	}
}