interp_errors.pl (2423B)
1 :- module(interp_errors, 2 [ interp_error/2 3 , interp_error/3 4 , parent_name/1 5 , validate_error/2 6 ]). 7 8 %%% messages 9 10 :- multifile prolog:error_message//1. 11 12 prolog:error_message(read_error) --> 13 [ 'Failed to read line.' ]. 14 15 prolog:error_message(parse_error(Codes)) --> 16 [ 'Failed to parse line: "~s".' - [Codes] ]. 17 18 prolog:error_message(evaluation_error(Codes)) --> 19 [ 'Failed to evaluate expression: "~s".' - [Codes] ]. 20 21 prolog:error_message(interp_error(eval, Expression)) --> 22 [ 'Don\'t know how to evaluate: "~w".' - [Expression] ]. 23 24 prolog:error_message(interp_error(eval_fail, Expression)) --> 25 [ 'Internal error evaluating: "~w".' - [Expression] ]. 26 27 prolog:error_message(interp_error(apply_fail, Expression)) --> 28 [ 'Internal error calling: "~w".' - [Expression] ]. 29 30 prolog:error_message(interp_error(arity, Func)) --> 31 [ 'Invalid amount of arguments for function: "~w".' - [Func] ]. 32 33 prolog:error_message(interp_error(unbound_var, VarName)) --> 34 [ 'No such variable: "~w".' - [VarName] ]. 35 36 prolog:error_message(interp_error(primitive, Func)) --> 37 [ 'Error evaluating primitive function: "~w".' - [Func] ]. 38 39 prolog:error_message(interp_error(type, Expected)) --> 40 [ 'Got invalid value for type ~w.' - [Expected] ]. 41 42 %%% exception throwing helpers 43 44 validate_error(interp_error(apply_fail, _), _) :- !. 45 validate_error(interp_error(eval, _), _) :- !. 46 validate_error(interp_error(eval_fail, _), _) :- !. 47 validate_error(interp_error(arity, _), _) :- !. 48 validate_error(interp_error(unbound_var, _), _) :- !. 49 validate_error(interp_error(primitive, _), _) :- !. 50 validate_error(interp_error(type, _), _) :- !. 51 validate_error(ErrorVal, Caller) :- 52 throw(error( 53 domain_error(interp_error/2, ErrorVal), 54 context(Caller, 'Tried to throw invalid interp_error') 55 )). 56 57 validate_and_throw(Error, Caller, Message) :- 58 validate_error(Error, Caller), 59 throw(error(Error, context(Caller, Message))). 60 61 parent_name(Name) :- 62 prolog_current_frame(ThisFrame), 63 prolog_frame_attribute(ThisFrame, parent, CallerFrame), 64 prolog_frame_attribute(CallerFrame, parent, CallerParentFrame), 65 prolog_frame_attribute(CallerParentFrame, predicate_indicator, Name). 66 67 interp_error(Kind, ErrorData) :- 68 parent_name(Caller), 69 validate_and_throw(interp_error(Kind, ErrorData), Caller, _). 70 71 interp_error(Kind, ErrorData, Message) :- 72 parent_name(Caller), 73 validate_and_throw(interp_error(Kind, ErrorData), Caller, Message). 74