在處理 Haskell 專案時,我遇到了這個問題,任何通過拋出到執行緒的例外都會throwTo導致Nothing當從SomeException型別轉換回我自己的例外型別時,使用fromException. 作為演示,請考慮以下代碼片段:
{-# LANGUAGE LambdaCase #-}
import Control.Concurrent (threadDelay)
import UnliftIO.Async (async, asyncThreadId, waitCatch)
import UnliftIO.Exception (Exception, SomeAsyncException (..), SomeException (..),
asyncExceptionToException, catch, fromException, throwIO,
throwTo, toException)
data MyException = Type1 | Type2
deriving (Show)
instance Exception MyException
toMyException :: SomeException -> Maybe MyException
toMyException = fromException
sleepAndThrow :: (Exception e) => Int -> e -> IO ()
sleepAndThrow i e = do
threadDelay (i * 1000000)
print e
throwIO e
main :: IO ()
main = do
t1 <- async $ sleepAndThrow 1 Type1 -- Throw Type1 in 1 second
t2 <- async $ threadDelay 500000 >> throwTo (asyncThreadId t1) Type2 -- Cancel t1 in 0.5
-- seconds with Type2
waitCatch t1 >>= \case
Left e -> putStr "Exception: " >> print (toMyException e)
Right () -> error "this should not happen"
看著這個,我希望得到以下控制臺輸出:
Exception: Just Type2
而我得到一個:
Exception: Nothing
你們中的任何人都可以告訴我,我做錯了什么嗎?
提前致謝。
uj5u.com熱心網友回復:
如果您要異步拋出它,請將您的例外設為異步例外。
instance Exception MyException where
toException = asyncExceptionToException
fromException = asyncExceptionFromException
這意味著如果要同步和Type1異步拋出,您需要有兩種不同的型別。Type2Type1Type2
但總的來說,我建議不要直接使用異步例外,而是使用async包中的實用程式,例如race.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/414266.html
標籤:
上一篇:無法識別異步函式
下一篇:如何在python模塊中重用函式
