[Haskell-beginners] Figuring out errors

Edward Z. Yang ezyang at MIT.EDU
Mon Aug 31 23:02:10 EDT 2009


Hello all,

I've been looking at [1] and trying to make tops and bottoms
(pardon the pun) of error handling in Haskell.  I am still
uncertain of what to do.

I recognize that there are different areas of code that
may have different requirements for errors:

* Pure code that is simple enough can probably get away
  with returning Maybe a

* Pure code that has multiple failure modes (the canonical
  example is parsing) should return a Either e a.  The type
  of e is a little difficult: many standard libraries seem
  to use String, but coming from Python this seems analogous
  to the long deprecated "string exceptions", which are quick
  and easy but not long-term maintainable due to lack of an
  easy way to match for them.  This leads naturally into
  Either MyError, which is supported using throwError and
  catchError.

* However, [1] specifically warns against using this technique
  in the IO monad, and I need a way to short circuit execution
  when a crucial pure operation fails (in Python, this would have just
  been an uncaught exception).  This suggests using ErrorT on
  IO, however, [1] also claims that this is generally not a good
  idea, and suggests to use throwDyn (which actually looks like
  it's been renamed to throw)

* Unfortunately, when I've tried to use this technique, I've
  run up against the fact that throw is implemented using bottom,
  so if I do a throw in a pure function, the exception might
  not actually surface up until I'm, say, attempting to print
  its return value to IO.  Denizens on #haskell have instructed
  me to treat bottom as the bane of existence and opt for
  stacking ErrorT on IO (it would be nice to know if this was
  a good idea or bad idea)

At which point, I am most thoroughly confused.  Pointers, please!

Cheers,
Edward

[1] http://www.randomhacks.net/articles/2007/03/10/haskell-8-ways-to-report-errors


More information about the Beginners mailing list