[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