2012-03-21 52 views
7

让我们作如下假设:有没有办法在Haskell中获取异常的类型?

  • 我的程序中止由于未捕获到异常
  • 我不知道该异常的类型是什么
  • 印刷错误信息中包含异常的类型没有暗示

如何找出该异常的类型?

小例子:

main = error "foo" 

(这是当然ErrorCall的,但你不能从错误消息告诉)

回答

16

是。假设您使用新的异常API,则所有Exception类型都必须是Typeable的实例。

import Control.Exception 
import Data.Typeable 
import Prelude hiding (catch) 

realMain = error "example" 
main = realMain `catch` h where 
    h (SomeException e) = do 
    putStrLn $ "Caught exception of type " ++ show (typeOf e) 
    putStrLn $ show e 

结果:

 
Caught exception of type GHC.Exception.ErrorCall 
example 
+0

你试过吗?我没有,但我认为这将打印'SomeException'。 – user1078763 2012-03-21 06:51:11

+2

Haskell代码'(SomeException e)'不**表示'e'具有'SomeException'类型,它会写成'e :: SomeException'(但不能出现在模式中)。上面的'SomeException'唯一的外观是作为构造函数。所以有两件事叫'SomeException':类型和构造函数。 – 2012-03-21 06:52:59

+0

啊,没有正确读取你的代码。所以是的,那确实会起作用。对于坐在等级结构中的例外情况,不是第一次,但我可以一步一步地到达那里。 – user1078763 2012-03-21 06:56:21

相关问题