如何追踪未捕获的异常类型?

Nik*_*kov 5 haskell exception

来自JVM语言,当异常未被捕获时输出庞大的堆栈跟踪,当我connect: does not exist (Connection refused)在程序的输出中看到类似的东西时,我感到很沮丧,然后它关闭.我知道有些例外被提出而没有被抓住.我甚至预计会发生异常,因为我试图连接到脱机服务器.所以我只需要一种方法来处理这个异常,但我不明白的是我应该如何找出那个异常的类型.

我通常在今天所做的只是谷歌搜索特定的消息,并通过所有邮件列表存档或源文件搜索信息,但这不是正确的方法.所以,我的问题如标题所示:

如何追踪未捕获的异常类型?

ben*_*ofs 7

您可以使用它typeOf来打印异常的类型:

import Data.Typeable
import Control.Exception
import System.IO.Error

blackbox1 :: IO ()
blackbox1 = throw $ mkIOError doesNotExistErrorType "blackbox1" Nothing (Just "evil")

blackbox2 :: IO ()
blackbox2 = throw DivideByZero

traceExceptionName :: IO () -> IO ()
traceExceptionName act = act `catch` \(SomeException e) -> do
  let rep = typeOf e
      tyCon = typeRepTyCon rep
  putStrLn $ "## Exception: Type " ++ show rep ++ " from module " ++ tyConModule tyCon ++ " from package " ++ tyConPackage tyCon
--  throw e -- Rethrow exception.

main :: IO ()
main = do
  traceExceptionName blackbox1
  traceExceptionName blackbox2
Run Code Online (Sandbox Code Playgroud)

示例输出

$ runhaskell ./main.hs            
## Exception: Type IOException from module GHC.IO.Exception from package base
## Exception: Type ArithException from module GHC.Exception from package base
Run Code Online (Sandbox Code Playgroud)