comparison src/luan/LuaException.java @ 42:786699c78837

implement try-catch git-svn-id: https://luan-java.googlecode.com/svn/trunk@43 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Sun, 23 Dec 2012 06:36:56 +0000
parents e3624b7cd603
children 80b67b1a653c
comparison
equal deleted inserted replaced
41:c53dc854e6cc 42:786699c78837
1 package luan; 1 package luan;
2 2
3 3
4 public class LuaException extends Exception { 4 public class LuaException extends Exception {
5 private final String stackTrace;
5 6
6 public LuaException(LuaState lua,LuaElement el,String msg) { 7 public LuaException(LuaState lua,LuaElement el,Object msg) {
7 super(hideNull(msg)+stackTrace(lua,el)); 8 super(message(msg),cause(msg));
9 stackTrace = stackTrace(lua,el,msg);
8 } 10 }
9 11
10 public LuaException(LuaState lua,LuaElement el,Exception cause) { 12 @Override public String getMessage() {
11 super(hideNull(cause.getMessage())+stackTrace(lua,el),cause); 13 return super.getMessage() + stackTrace;
12 } 14 }
13 15
14 private static String hideNull(String s) { 16 private String message() {
15 return s==null ? "" : s; 17 return super.getMessage();
16 } 18 }
17 19
18 private static String stackTrace(LuaState lua,LuaElement el) { 20 private static Throwable cause(Object msg) {
21 return msg instanceof Throwable ? (Throwable)msg : null;
22 }
23
24 private static String message(Object msg) {
25 if( msg instanceof LuaException ) {
26 LuaException le = (LuaException)msg;
27 return le.message();
28 } else if( msg instanceof Throwable ) {
29 Throwable t = (Throwable)msg;
30 return t.getMessage();
31 } else {
32 return msg.toString();
33 }
34 }
35
36 private static String stackTrace(LuaState lua,LuaElement el,Object msg) {
19 StringBuilder buf = new StringBuilder(); 37 StringBuilder buf = new StringBuilder();
20 int i = lua.stackTrace.size() - 1; 38 int i = lua.stackTrace.size() - 1;
21 do { 39 do {
22 StackTraceElement stackTraceElement = lua.stackTrace.get(i); 40 StackTraceElement stackTraceElement = lua.stackTrace.get(i);
23 buf.append( "\n\t" ).append( el.toString(stackTraceElement.fnName) ); 41 buf.append( "\n\t" ).append( el.toString(stackTraceElement.fnName) );
24 el = stackTraceElement.call; 42 el = stackTraceElement.call;
25 } while( --i >= 0 ); 43 } while( --i >= 0 );
44 if( msg instanceof LuaException ) {
45 LuaException le = (LuaException)msg;
46 buf.append( "\ncaused by:" ).append( le.stackTrace );
47 }
26 return buf.toString(); 48 return buf.toString();
27 } 49 }
28 } 50 }