Mercurial Hosting > luan
annotate core/src/luan/LuanException.java @ 682:0c334975d526
finish stack trace
| author | Franklin Schmidt <fschmidt@gmail.com> | 
|---|---|
| date | Thu, 14 Apr 2016 21:41:40 -0600 | 
| parents | cdc70de628b5 | 
| children | 67dd1449e354 | 
| rev | line source | 
|---|---|
| 1 
2df768b926aa
start Luan
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: diff
changeset | 1 package luan; | 
| 
2df768b926aa
start Luan
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: diff
changeset | 2 | 
| 200 
9fb218211763
add Package.block();
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
171diff
changeset | 3 import java.io.StringWriter; | 
| 
9fb218211763
add Package.block();
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
171diff
changeset | 4 import java.io.PrintWriter; | 
| 682 | 5 import java.util.List; | 
| 6 import java.util.ArrayList; | |
| 1 
2df768b926aa
start Luan
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: diff
changeset | 7 | 
| 200 
9fb218211763
add Package.block();
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
171diff
changeset | 8 | 
| 682 | 9 public final class LuanException extends Exception { | 
| 1 
2df768b926aa
start Luan
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: diff
changeset | 10 | 
| 646 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 11 public LuanException(String msg,Throwable cause) { | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 12 super(msg,cause); | 
| 42 
786699c78837
implement try-catch
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
40diff
changeset | 13 } | 
| 
786699c78837
implement try-catch
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
40diff
changeset | 14 | 
| 646 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 15 public LuanException(String msg) { | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 16 super(msg); | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 17 } | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 18 | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 19 public LuanException(Throwable cause) { | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 20 super(cause); | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 21 } | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 22 | 
| 682 | 23 public LuanTable table() { | 
| 24 LuanTable table = new LuanTable(); | |
| 531 
f99c79b0b426
change LuanException.getFullMessage() to not require LuanState
 Franklin Schmidt <fschmidt@gmail.com> parents: 
517diff
changeset | 25 table.rawPut( "java", this ); | 
| 645 | 26 /* | 
| 576 | 27 for( StackTraceElement ste : luan.stackTrace ) { | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 28 LuanTable tbl = new LuanTable(); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 29 tbl.rawPut( "source", ste.call.source.name ); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 30 tbl.rawPut( "line", ste.call.lineNumber() ); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 31 tbl.rawPut( "call_to", ste.fnName ); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 32 table.rawPut( table.rawLength() + 1, tbl ); | 
| 200 
9fb218211763
add Package.block();
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
171diff
changeset | 33 } | 
| 645 | 34 */ | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 35 LuanTable metatable = new LuanTable(); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 36 table.setMetatable(metatable); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 37 try { | 
| 646 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 38 table.rawPut( "get_message", new LuanJavaFunction( | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 39 LuanException.class.getMethod( "getMessage" ), this | 
| 
cdc70de628b5
simplify LuanException
 Franklin Schmidt <fschmidt@gmail.com> parents: 
645diff
changeset | 40 ) ); | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 41 table.rawPut( "throw", new LuanJavaFunction( | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 42 LuanException.class.getMethod( "throwThis" ), this | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 43 ) ); | 
| 682 | 44 table.rawPut( "get_java_stack_trace_string", new LuanJavaFunction( | 
| 45 LuanException.class.getMethod( "getJavaStackTraceString" ), this | |
| 46 ) ); | |
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 47 metatable.rawPut( "__to_string", new LuanJavaFunction( | 
| 682 | 48 LuanException.class.getMethod( "getFullMessage" ), this | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 49 ) ); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 50 } catch(NoSuchMethodException e) { | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 51 throw new RuntimeException(e); | 
| 42 
786699c78837
implement try-catch
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
40diff
changeset | 52 } | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 53 return table; | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 54 } | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 55 | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 56 public void throwThis() throws LuanException { | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 57 throw this; | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 58 } | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 59 | 
| 531 
f99c79b0b426
change LuanException.getFullMessage() to not require LuanState
 Franklin Schmidt <fschmidt@gmail.com> parents: 
517diff
changeset | 60 public String getFullMessage() { | 
| 682 | 61 return getLuanStackTraceString(); | 
| 645 | 62 /* | 
| 40 
e3624b7cd603
implement stack trace
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
37diff
changeset | 63 StringBuilder buf = new StringBuilder(); | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 64 | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 65 Object msg = table.rawGet("message"); | 
| 531 
f99c79b0b426
change LuanException.getFullMessage() to not require LuanState
 Franklin Schmidt <fschmidt@gmail.com> parents: 
517diff
changeset | 66 String msgStr = (String)table.rawGet("message_string"); | 
| 
f99c79b0b426
change LuanException.getFullMessage() to not require LuanState
 Franklin Schmidt <fschmidt@gmail.com> parents: 
517diff
changeset | 67 buf.append( msgStr ); | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 68 | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 69 for( int i = table.rawLength(); i>=1; i-- ) { | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 70 LuanTable tbl = (LuanTable)table.rawGet(i); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 71 buf.append( "\n\t" ).append( tbl.rawGet("source") ).append( " line " ).append( tbl.rawGet("line") ); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 72 Object callTo = tbl.rawGet("call_to"); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 73 if( callTo != null ) | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 74 buf.append( " in call to '" ).append( callTo ).append( "'" ); | 
| 42 
786699c78837
implement try-catch
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
40diff
changeset | 75 } | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 76 | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 77 if( msg instanceof Throwable ) { | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 78 buf.append( "\nCaused by: " ); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 79 Throwable cause = (Throwable)msg; | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 80 StringWriter sw = new StringWriter(); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 81 cause.printStackTrace(new PrintWriter(sw)); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 82 buf.append( sw ); | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 83 } | 
| 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 84 | 
| 40 
e3624b7cd603
implement stack trace
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
37diff
changeset | 85 return buf.toString(); | 
| 645 | 86 */ | 
| 682 | 87 } | 
| 88 | |
| 89 public String getJavaStackTraceString() { | |
| 90 return getJavaStackTraceString(this); | |
| 91 } | |
| 92 | |
| 93 private static String getJavaStackTraceString(Throwable th) { | |
| 645 | 94 StringWriter sw = new StringWriter(); | 
| 682 | 95 th.printStackTrace(new PrintWriter(sw)); | 
| 645 | 96 return sw.toString(); | 
| 37 
8a57ebfdfd78
add JavaLib
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: 
2diff
changeset | 97 } | 
| 481 
5d4a78c93383
luan errors are now tables
 Franklin Schmidt <fschmidt@gmail.com> parents: 
200diff
changeset | 98 | 
| 682 | 99 private List<StackTraceElement> justLuan() { | 
| 100 List<StackTraceElement> list = new ArrayList<StackTraceElement>(); | |
| 101 StackTraceElement[] orig = getStackTrace(); | |
| 102 for( int i=0; i<orig.length; i++ ) { | |
| 103 StackTraceElement ste = orig[i]; | |
| 104 if( !ste.getClassName().startsWith("luan.impl.EXP") ) | |
| 105 continue; | |
| 106 list.add(ste); | |
| 107 if( !ste.getMethodName().equals("doCall") ) | |
| 108 i++; | |
| 109 } | |
| 110 return list; | |
| 111 } | |
| 112 | |
| 113 public String getLuanStackTraceString() { | |
| 114 StringBuilder sb = new StringBuilder(); | |
| 115 sb.append( getMessage() ); | |
| 116 for( StackTraceElement ste : justLuan() ) { | |
| 117 sb.append( "\n\t" ).append( ste.getFileName() ).append( " line " ).append( ste.getLineNumber() ); | |
| 118 String method = ste.getMethodName(); | |
| 119 if( !method.equals("doCall") ) | |
| 120 sb.append( " in function '" ).append( method.substring(1) ).append( "'" ); | |
| 121 } | |
| 122 Throwable cause = getCause(); | |
| 123 if( cause != null ) | |
| 124 sb.append( "\nCaused by: " ).append( getJavaStackTraceString(cause) ); | |
| 125 return sb.toString(); | |
| 126 } | |
| 127 | |
| 1 
2df768b926aa
start Luan
 fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> parents: diff
changeset | 128 } | 
