Browse thread
[Caml-list] assert caught by try with _
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Jacques Garrigue <garrigue@k...> |
| Subject: | Re: [Caml-list] assert caught by try with _ |
From: Chris Hecker <checker@d6.com>
> >You could tell the same for stack overflow and some other kinds of
> >exceptions. OCaml uniformly treat failures as exceptions, and that's the
> >right thing to do. But catching exceptions with _ , without even printing
> >them, is not the "right thing" and is definitly huge pain and error prone.
>
> I totally disagree about assert being the same as a stack overflow in
> nature, but more importantly, you're ignoring the lessons learned from C++
> and Java on the exception specification front. You just don't know what
> exceptions code you call in a real program will throw in general. There
> are plenty of times when you want to try something at runtime and just bail
> if it doesn't work, and you don't care about the specifics of why it didn't
> work. A single "with _" will mask any assertions living below it, which
> seems to me to be a bad thing since by definition an assert is a
> development debugging tool. Assert should just blow up, like in C (at
> least as an option). You shouldn't have to remember to put a "with" clause
> in for it.
But you might really want to catch assert failures!
For instance if you're building a debugging tool.
So the problem rather stems from the fact exn is a flat type. You have
no way to specify "categories" of exceptions, like you would do in
Java.
Also you could view the behaviour of [try ... with _ -> ...] as
dangerous, and prefer a different behaviour. Unfortunately, _ is
expected to mean any exception, and it would be difficult to make it
mean something else.
Note that it's easy enough to define a class of exceptions as fatal:
let check_fatal = function
Assert_failure _ | Stack_overflow | Match_failure _ as exn -> raise exn
| _ -> ();;
Then you just have to write
try ... with exn -> check_fatal exn; ...
You can certainly use camlp4 to do this automatically.
Alternatively, one could argue that this is similar to the ctrl-break
problem: [Sys.catch_break] allows you to decide whether you want it to
be catchable or not. Unfortunately this would imply some extra cost
for [raise].
Jacques
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners