我需要执行许多可能以多种无法想象的方式失败的计算,但是这些失败可以忽略(通知用户)。但是,我不想忽略AsyncException
就像UserInterrupt
这样用户可以停止使用该程序Control- C。
如果我尝试中止下面的程序,它将仅输出# failed: user interrupt
–好像无法将异常强制转换为AsyncException
。从user interrupt
正在打印我们知道的例外是UserInterrupt
两者皆可抛(cast UserInterrupt :: Maybe AsyncException
)。
为什么UserInterrupt
例外,没有看出端倪,并重新抛出?
import Control.Exception
import Control.Monad
import Data.Typeable
main = forM_ [1..500000] processNumber
processNumber n =
handle h (simulateComputation n)
where
h (SomeException e) =
case (cast e :: Maybe AsyncException) of
Just ae ->
throw ae
Nothing ->
putStrLn $ show n ++ " failed: " ++ show e
simulateComputation n = do
putStrLn "...Obtaining data and computing..."
--when (n `mod` 1000 == 0) $
-- throw (ErrorCall "ComputationFailed")
--when (n `mod` 1111 == 0) $
-- throw DivideByZero
这是语言的一个黑暗角落。实际上,在将转换为时将AsyncException
其包装。使用代替(或强制转换为)。SomeAsyncException
SomeException
asyncExceptionFromException
cast
SomeAsyncException
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句