我有以下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
方法?
答案 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
告知最终用户有关已处理异常的功能。