为什么GHC不使用我的displayException方法?

时间:2019-04-03 08:43:18

标签: haskell

我有以下Haskell程序,其中我自定义了displayException方法以方便人类显示异常:

import Control.Exception
import Data.Typeable

data MyException = MyException String
                 deriving (Show, Typeable)

instance Exception MyException where
  displayException (MyException e) = "oops! " ++ e

main = throw $ MyException "something's wrong"

但是当我在GHC 8.6.4下运行它时,我得到了

myprog.hs: MyException "something's wrong"

而不是预期的

myprog.hs: oops! something's wrong

为什么不使用我的displayException方法?

1 个答案:

答案 0 :(得分:4)

GHC的运行时不使用displayException向用户报告捕获的异常。

您需要提供自定义的Show实例:

data MyException = MyException String
    deriving Typeable

instance Show MyException where
    show (MyException e) = "oops! " ++ e

instance Exception MyException

displayException以前是added years ago,目的是采用不同的方法来进行异常序列化(show)和向用户报告(displayException)。

在上述讨论中,我发现了this reply by Edward Kmett,这似乎是GHC RTS不使用displayException的充分理由。

  

我的经验是,每当有人撰写“有用的”节目时   例如它结束了任何事情。

     

为什么?

     

当您打印它们的列表时,会发生什么?   更大的结构?

     

我总是想起一堆你的例外情况   异步异常包装器或我数据中某人的职位类型   结构[...]

     

“有用的”显示实例不是合成的。

因此,GHC RTS竭力为开发人员提供有关未处理异常的尽可能详细和可解析的信息。拥有使用displayExceptions告知最终用户有关已处理异常的功能。