Skip to content


Subversion checkout URL

You can clone with
Download ZIP
error and debug function for haskell that give file locations
Haskell C Shell
Latest commit b7a6238 @gregwebs change assertEq to just operate in IO
Also add `assertEq` which uses MonadIO
Do the same for `assertB`

Common debugging/error/exception functions and template haskell versions that give file location information


> $(err "OH NO!")
main:Main main.hs:16:1 OH NO!

Notice how it displays package:module file:line:character It exposes the functions err (error), undef (undefined), and trc (Debug.Trace.trace). All of these behave the same as their normal counterpart but also spit out a location.

> $undef
main:Main test/main.hs:10:5 undefined
main: Prelude.undefined

2 other error functions are included- fromJst and fromRht.

> $fromJst Nothing
main:Main test/main.hs:27:4 fromJst: Nothing

Debug helpers

I also included my favorite helper, debug, which is like trace but just show the value.

> debug [1,2,3]
DEBUG: [1,2,3]

There is a version without the DEBUG prefix called both strace and traceId. And Here is the TH version of debug dbg:

> $dbg [1,2,3]
DEBUG main:Main main.hs:1:3 [1,2,3]

Additionally there is a debugMsg and a TH function dbgMsg can be used to add a message prefix:

> $(dbgMsg "the list") [1,2,3]
DEBUG main:Main main.hs:1:3 the list: [1,2,3]

Also there is debugM for stand-alone use in a monad. There is also functions ltrace and ltraceM (short for labeled trace)- it is like debug, but you tell it what string to print out instead of "DEBUG".


Also there is a version of thrwIO that gives location information. thrwsIO takes appends a string to the file locaiton information.

import Control.Exception.Base (Exception(..))
import Prelude hiding (catch)
import Control.Exception.Control (throwIO, catch)

data AException = AException String deriving (Show, Typeable)
instance Exception AException

($(thrwIO) AException) `catch` \e -> putStrLn ("Caught " ++ show (e :: AException))

Caught AException "main:Main test/main.hs:25:6"

Just added: reThrow. It catches exceptions, stamps some file location information onto it, and re-throws the exception. Note that the file-location information is only for the reThrow usage site, it is still best to use thrwIO if you control the creation of the exception.

Test Suite


Something went wrong with that request. Please try again.