[Haskell-cafe] Use unsafePerformIO to catch Exception?

Henning Thielemann lemming at henning-thielemann.de
Mon Mar 23 20:10:59 EDT 2009


On Mon, 23 Mar 2009, Xiao-Yong Jin wrote:

> Hi,
>
> I just feel it is not comfortable to deal with exceptions
> only within IO monad, so I defined
>
>> tryArith :: a -> Either ArithException a
>> tryArith = unsafePerformIO . try . evaluate
>
> and it works quite good as
>
>> map (tryArith . (div 5)) [2,1,0,5]
>
> evaluates to
>
>> [Right 2,Right 5,Left divide by zero,Right 1]
>
> However, I guess unsafePerformIO definitely has a reason for
> its name.  As I read through the document in
> System.IO.Unsafe, I can't convince myself whether the use of
> 'tryArith' is indeed safe or unsafe.

Try to never use exception handling for catching programming errors! 
Division by zero is undefined, thus a programming error when it occurs.
  http://www.haskell.org/haskellwiki/Error
  http://www.haskell.org/haskellwiki/Exception
   I'm afraid, a Maybe or Either or Exceptional (see explicit-exception 
package) return value is the only way to handle exceptional return values 
properly. Maybe in the larger context of your problem zero denominators 
can be avoided? Then go this way.


More information about the Haskell-Cafe mailing list