hvr*_*hvr 4 haskell timeout exception-handling exception
我终于能够追踪我在下来的(至少我)令人惊讶的互动了bug mask和timeout:
import System.Timeout
import Control.Exception
ack :: Int -> Int -> Int
ack m n | m == 0, n >= 0 = n + 1
| m > 0, n == 0 = ack (m - 1) 1
| m > 0, n > 0 = ack (m - 1) (ack m (n - 1))
tryack :: Int -> Int -> IO (Maybe Int)
tryack m n = timeout 100000 {- uS -} $ evaluate $ ack m n
main :: IO ()
main = do
a <- tryack 3 11
print a -- Nothing
b <- mask_ $ tryack 3 11
print b -- Just 16381 after a few seconds
Run Code Online (Sandbox Code Playgroud)
这让我觉得它是一种相当"非组合"的交互,因为这意味着如果一个库内部使用timeout,mask在调用链的某个地方外部应用可能会导致库出现故障.
那么这是(已知的)实施中的缺陷timeout还是故意的?
怎么mask_办?
执行带有异步异常屏蔽的IO计算.也就是说,任何尝试使用Control.Exception.throwTo在当前线程中引发异常的线程都将被阻塞,直到再次取消屏蔽异步异常.
那怎么timeout办?
将IO计算包装为超时,如果在n微秒(1/10 ^ 6秒)内没有结果可用则返回Nothing.如果在超时到期之前结果可用,则返回Just a....一个棘手的实现细节是如何中止IO计算的问题.这个组合器在内部依赖于异步异常.
所以...... mask_正在阻止timeout提供例外.就是这样.
你不能使用mask和timeout工作.
也许更好的方法是使用处理程序捕获除了timeout使用的异常之外的任何东西?
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |