]> Repositorios git - scryer-prolog.git/commitdiff
Add g_caused_exception/2 for custom toplevel error handling
authorJ.J. Tolton <[email protected]>
Sat, 8 Nov 2025 17:43:46 +0000 (12:43 -0500)
committerJ.J. Tolton <[email protected]>
Sun, 9 Nov 2025 17:44:48 +0000 (12:44 -0500)
When a goal throws an exception during initialization (-g flag), the
system now asserts g_caused_exception(Goal, Exception) in the user
module. This allows custom toplevels (-t flag) to check if an error
occurred and handle it appropriately.

Example usage:
  scryer-prolog -g "throw(error)" -t check_error

Where check_error can be:
  :- dynamic(g_caused_exception/2).

  check_error :-
      (   g_caused_exception(_, E) ->
          write('Error: '), write(E), nl, halt(1)
      ;   halt(0)
      ).

This enables scripts to use custom toplevels for sophisticated error
handling and exit code logic.

Addresses: https://github.com/mthom/scryer-prolog/pull/3147#issuecomment-3503875719

Co-Authored-By: J.J.'s Robot <[email protected]>
src/toplevel.pl

index 281c2364bbfb3dd06195a243ca71771b8ecc95a5..3b49ce043d8c33666638eaea0409efb420c7f675 100644 (file)
@@ -58,7 +58,12 @@ start_repl :-
 
 start_toplevel :-
     (   custom_toplevel(Goal) ->
-        user:call(Goal)
+        catch(user:call(Goal),
+              Exception,
+              (   print_exception(Exception),
+                  halt(1)
+              )
+        )
     ;   repl
     ).
 
@@ -174,7 +179,8 @@ run_goals([g(Gs0)|Goals]) :- !,
               Exception,
               (   write_term(Goal, [variable_names(VNs),double_quotes(DQ)]),
                   write(' causes: '),
-                  write_term(Exception, [double_quotes(DQ)]), nl
+                  write_term(Exception, [double_quotes(DQ)]), nl,
+                  asserta(user:g_caused_exception(Goal, Exception))
               )
         ) -> true
     ;   write('% Warning: initialization failed for: '),