
It's a pattern match error, implemented by throwing an asynchronous
exception. The idea being, that we only have one mechanism (well, an
synchronous exceptions, thrown via throwIO).
Yes, I know that there's a difference between "error" and "exception",
but I would argue that which is which depends on the program. For
example, for most programs a pattern match error is a fatal condition,
there's no sane recovery from it. OTOH, in a program like GHCi, a
pattern match error in an executed statement is an exceptional
condition, which we want to catch, so it doesn't kill GHCi.
2008/11/22 Henning Thielemann
On Sat, 22 Nov 2008, Thomas Schilling wrote:
Be careful, though. This only works if there's a single constructor for your exception type. If there are multiple, you should write it like this:
thing_to_try `catch` \(e :: MyErrorType) -> case e of MyError1 _ -> ..; MyError2 _ -> ...
If you write `catch` (MyError1 ...) and a MyError2 is thrown, you will get a pattern match error exception.
A "pattern match exception" or "pattern match error"? I mean, not handling a certain pattern is a programming error not an exceptional condition at runtime. Thus there is no need to throw a "pattern match exception" which is catched and handled somewhere else.
-- Push the envelope. Watch it bend.