Is it possible to register a global exception handler?
I suppose I could just nest everything inside one giant function if I
really had to, but I like my toplevel expressions ;-)
Jonathan
_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs
Here is a simple Camlp4 filter that written for the new Camlp4 version (CVS) :
$ cat global_handler.ml
open Camlp4.PreCast;
value ghost = Loc.ghost;
value global_handler_ref = ref <:expr@ghost<>>;
value find_global_handler = object
inherit Ast.map as super;
method str_item st = do {
match st with
[ <:str_item< value global_handler = $f$ >> -> global_handler_ref.val := f
| _ -> () ];
super#str_item st
};
end;
AstFilters.register_str_item_filter
(fun st ->
let _ = find_global_handler#str_item st in
<:str_item@ghost< try let module Main = struct $st$ end in ()
with e -> $global_handler_ref.val$ e >>);
$ ocamlc -I +camlp4 -c -pp camlp4rf global_handler.ml
$ cat global_handler_test.ml
open Format;;
let f1 x = printf "f1 %d@." x;;
let f2 x = printf "f2 %f@." x;;
let f3 x = printf "f3 %s@." x;;
f1 1;;
f2 1.1;;
f3 "1.1.1";;
raise (Failure "test");;
let global_handler e =
(* Note that I need to give the complete name for eprintf since
Format is not opened in the new environment of global_handler. *)
Format.eprintf "global_handler: %s@." (Printexc.to_string e)
$ ocamlc -pp 'camlp4o global_handler.cmo' global_handler_test.ml
$ ./a.out
f1 1
f2 1.100000
f3 1.1.1
global_handler: Failure("test")
$ camlp4o global_handler.cmo -printer OCaml global_handler_test.ml
try
let module Main =
struct
open Format
let f1 x = printf "f1 %d@." x
let f2 x = printf "f2 %f@." x
let f3 x = printf "f3 %s@." x
let _ = f1 1
let _ = f2 1.1
let _ = f3 "1.1.1"
let _ = raise (Failure "test")
let global_handler e =
(* Note that I need to give the complete name for eprintf since
Format is not opened in the new environment of global_handler. *)
Format.eprintf "global_handler: %s@." (Printexc.to_string e)
end
in ()
with
| e ->
(fun e -> Format.eprintf "global_handler: %s@." (Printexc.to_string e)) e
Cheers,
--
Nicolas Pouillard
Ah, defining a module inside a function is a neat trick! I didn't
think of that. Well, I guess it couldn't hurt to do that with all the
modules which could cause trouble at runtime...
Can I build the new camlp4 with 3.09.2 tools?
Jonathan
In fact camlp4 will be part of OCaml 3.10 distribution, so it's better
to try it directly like that, instead of mixing them with 3.09.2.
--
Nicolas Pouillard