[Haskell-cafe] exceptions vs. Either

Alastair Reid alastair at reid-consulting-uk.ltd.uk
Tue Aug 3 08:21:50 EDT 2004


>        Prelude.head : empty list
>        Prelude.read : no parse
> and    Prelude.(!!) : index too large
> and so on.
>
> Is there any easy way (TH?) to amend these to output the line number
> of the offending caller?

In a program of any size, I usually avoid using these functions and instead 
define functions like:

  --| 1st arg is error message for empty lists 
  head' :: Doc -> [a] -> a

  --| 1st arg is description of kind of thing in list
  --  Reports error if length of list /= 1
  unique :: Doc -> [a] -> a

etc.

Another approach is to use a function:

  inContext :: String -> a -> a

(implemented using mapException) like this:

  inContext "evaluating expression" (eval env e)

to transform an exception of the form:

   error "Division by zero"

into

   error "Division by zero while evaluating expression"

Since the inContext function is rather like ghc's profiling function 'scc', it 
would be nice if ghc had a command-line flag to insert a call to inContext 
everywhere that it inserts a call to scc when you use -prof-all.  (Of course, 
you'd probably take a big stack-space hit from doing so since the chain of 
calls to inContext is equivalent to the stack you would expect if using call 
by value without tail call optimization.

--
Alastair Reid



More information about the Haskell-Cafe mailing list