我想知道为什么 MailboxProcessor
处理异常的默认策略是 默默忽略 它们。例如:
let counter =
MailboxProcessor.Start(fun inbox ->
let rec loop() =
async { printfn "waiting for data..."
let! data = inbox.Receive()
failwith "fail" // simulate throwing of an exception
printfn "Got: %d" data
return! loop()
}
loop ())
()
counter.Post(42)
counter.Post(43)
counter.Post(44)
Async.Sleep 1000 |> Async.RunSynchronously
什么都没有发生。程序执行没有致命的停止,也没有弹出“未处理的异常”消息框。什么也没有。
如果有人使用PostAndReply
方法,则情况会变得更糟:死锁是必然结果。
这种行为的原因是什么?
Error
。我想知道为什么默认的错误处理程序什么都不做。它可以重新抛出异常,或写入到stderr,或停止应用程序——任何事情都比默默忽略异常要好。 - qehgtMailboxProcessor
上的现有事件,但不知何故完全错过了Error
事件... - Tomas PetricekMailboxProcessor
失败时崩溃而不是继续以可能破损的状态运行,您也可以raise
异常而不是将其打印出来。 - spiffytech