【发布时间】:2019-03-26 01:00:56
【问题描述】:
我正在尝试捕获由“纯”代码引发的自定义异常。我不明白我的程序的行为。
我正在使用 GHC 8.6.3。这是我的代码:
import Control.Exception
newtype Problem = Problem String deriving Show
instance Exception Problem
foo :: Int -> Int
foo n = n + (throw $ Problem "Whoops")
baz :: IO Int
baz =
return (foo 1)
`catch` \(Problem _) -> return 100
main = do
n <- baz
print n
`catch` \(Problem msg) -> putStrLn msg
我希望异常被第一个处理程序捕获,并让程序打印“100”。相反,它被第二个处理程序捕获并打印“哎呀”。
为什么异常在main 而不是baz 中被捕获?如何在baz 中捕获异常?
【问题讨论】: