Exception handling
This commit is contained in:
+17
-2
@@ -17,7 +17,8 @@ int main(int argc, const char **argv) {
|
||||
ReadStream s;
|
||||
read_stream_init(&s, src, src_len);
|
||||
LispVal *r;
|
||||
CONDITION_CASE(
|
||||
bool had_toplevel_error = false;
|
||||
HANDLER_BIND1(
|
||||
LIST(Qt),
|
||||
{
|
||||
while ((r = read(&s))) {
|
||||
@@ -29,9 +30,23 @@ int main(int argc, const char **argv) {
|
||||
Fprint_condition(EXCEPTION_NAME(), EXCEPTION_DATA(),
|
||||
Qerror_write_byte); //
|
||||
fprintf(stderr, "\nBacktrace (toplevel comes last):\n");
|
||||
LispVal *backtrace = Fbacktrace();
|
||||
DOLIST(frame, backtrace) {
|
||||
LispVal *name = FIRST(frame);
|
||||
bool evaled = !NILP(THIRD(frame));
|
||||
LispVal *args = FOURTH(frame);
|
||||
fprintf(stderr, " %c ", evaled ? '-' : '*');
|
||||
Fprinc(name, Qerror_write_byte);
|
||||
Fprinc(args, Qerror_write_byte);
|
||||
fputc('\n', stderr);
|
||||
}
|
||||
CLEAR_EXCEPTION();
|
||||
had_toplevel_error = true;
|
||||
goto toplevel_error;
|
||||
});
|
||||
toplevel_error:
|
||||
unwind_to(toplevel);
|
||||
lisp_shutdown();
|
||||
free(src);
|
||||
return 0;
|
||||
return had_toplevel_error ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user