Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

error and debug function for haskell that give file locations

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 Control
Octocat-spinner-32 Debug
Octocat-spinner-32 FileLocation
Octocat-spinner-32 test
Octocat-spinner-32 .gitignore
Octocat-spinner-32 FileLocation.hs
Octocat-spinner-32 LICENSE
Octocat-spinner-32 README.md
Octocat-spinner-32 Setup.hs
Octocat-spinner-32 file-location.cabal
README.md

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

Error/undefined

> $(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]
[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]
[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]
[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".

Exceptions

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

./test/run.sh

Something went wrong with that request. Please try again.