有没有办法在Haskell中获取异常类型?

use*_*763 7 haskell

让我们做出以下假设:

  • 我的程序因未捕获的异常而中止
  • 我不知道该异常的类型是什么
  • 打印的错误消息不包含异常类型的提示

我如何找出该例外的类型?

最小的例子:

main = error "foo"
Run Code Online (Sandbox Code Playgroud)

(这是当然的ErrorCall,但你无法从错误信息中得知.)

Die*_*Epp 17

是.假设您使用新的异常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
Run Code Online (Sandbox Code Playgroud)

结果:

Caught exception of type GHC.Exception.ErrorCall
example

  • Haskell代码`(SomeException e)`不**意味着`e`具有类型`SomeException`,它将写成`e :: SomeException`(但不能出现在模式中).上面的`SomeException`的唯一出现是作为构造函数.所以有两个叫做"SomeException"的东西:类型和构造函数. (2认同)
  • 还要注意`SomeException`既是类型又是数据构造函数(比如`data T = T a`):`\(SomeException e)`与catch` \(e :: SomeException)`不同.第一个展开,第二个展开.如果你在第二个上调用`typeOf e`,它将始终返回`SomeException`而不是你期望的. (2认同)