caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] A global exception handler...
@ 2006-07-06 14:39 Jonathan Roewen
  2006-07-06 14:48 ` Till Varoquaux
  0 siblings, 1 reply; 6+ messages in thread
From: Jonathan Roewen @ 2006-07-06 14:39 UTC (permalink / raw)
  To: OCaml

Hi,

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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] A global exception handler...
  2006-07-06 14:39 [Caml-list] A global exception handler Jonathan Roewen
@ 2006-07-06 14:48 ` Till Varoquaux
  2006-07-06 15:25   ` Nicolas Pouillard
  0 siblings, 1 reply; 6+ messages in thread
From: Till Varoquaux @ 2006-07-06 14:48 UTC (permalink / raw)
  To: Jonathan Roewen; +Cc: OCaml

On 7/6/06, Jonathan Roewen <jonathan.roewen@gmail.com> wrote:
> Hi,
>
> 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 ;-)
>
CamlP4 might come in handy here. I'm guessing you could rewrite your
program so that all your toplevel expressions are in one main ()
function using camlp4. It would have some limitations though: for
instance your exception handler could not use anything defined in main
(unless you where using references). I'm guessing it's not so bad
because whatever happens you cannot have a global exception handler
relying to much on stuff defined in your programm.
> Jonathan


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] A global exception handler...
  2006-07-06 14:48 ` Till Varoquaux
@ 2006-07-06 15:25   ` Nicolas Pouillard
  2006-07-06 15:33     ` Jonathan Roewen
  0 siblings, 1 reply; 6+ messages in thread
From: Nicolas Pouillard @ 2006-07-06 15:25 UTC (permalink / raw)
  To: Till Varoquaux; +Cc: Jonathan Roewen, OCaml

On 7/6/06, Till Varoquaux <till.varoquaux@gmail.com> wrote:
> On 7/6/06, Jonathan Roewen <jonathan.roewen@gmail.com> wrote:
> > Hi,
> >
> > 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 ;-)
> >
> CamlP4 might come in handy here. I'm guessing you could rewrite your
> program so that all your toplevel expressions are in one main ()
> function using camlp4. It would have some limitations though: for
> instance your exception handler could not use anything defined in main
> (unless you where using references). I'm guessing it's not so bad
> because whatever happens you cannot have a global exception handler
> relying to much on stuff defined in your programm.

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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] A global exception handler...
  2006-07-06 15:25   ` Nicolas Pouillard
@ 2006-07-06 15:33     ` Jonathan Roewen
  2006-07-06 15:37       ` Nicolas Pouillard
  0 siblings, 1 reply; 6+ messages in thread
From: Jonathan Roewen @ 2006-07-06 15:33 UTC (permalink / raw)
  To: Nicolas Pouillard; +Cc: Till Varoquaux, OCaml

> $ 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
>

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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] A global exception handler...
  2006-07-06 15:33     ` Jonathan Roewen
@ 2006-07-06 15:37       ` Nicolas Pouillard
  2006-07-06 15:39         ` Jonathan Roewen
  0 siblings, 1 reply; 6+ messages in thread
From: Nicolas Pouillard @ 2006-07-06 15:37 UTC (permalink / raw)
  To: Jonathan Roewen; +Cc: Till Varoquaux, OCaml

On 7/6/06, Jonathan Roewen <jonathan.roewen@gmail.com> wrote:
> > $ 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
> >
>
> 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?
>

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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] A global exception handler...
  2006-07-06 15:37       ` Nicolas Pouillard
@ 2006-07-06 15:39         ` Jonathan Roewen
  0 siblings, 0 replies; 6+ messages in thread
From: Jonathan Roewen @ 2006-07-06 15:39 UTC (permalink / raw)
  To: Nicolas Pouillard; +Cc: Till Varoquaux, OCaml

> > Can I build the new camlp4 with 3.09.2 tools?
> >
>
> 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.

My webhost only has 3.09.2 installed. I guess I could try rework your
code to work with existing camlp4 instead...


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2006-07-06 15:39 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-07-06 14:39 [Caml-list] A global exception handler Jonathan Roewen
2006-07-06 14:48 ` Till Varoquaux
2006-07-06 15:25   ` Nicolas Pouillard
2006-07-06 15:33     ` Jonathan Roewen
2006-07-06 15:37       ` Nicolas Pouillard
2006-07-06 15:39         ` Jonathan Roewen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).