我希望能够在F#中编写计算表达式,以便在操作抛出异常时能够重试。目前我的代码如下:
let x = retry (fun() -> GetResourceX())
let y = retry (fun() -> GetResourceY())
let z = retry (fun() -> DoThis(x, y))
etc. (this is obviously an astract representation of the actual code)
我需要能够对每个函数进行一定次数的重试,这些次数已在其他地方定义好。我考虑使用计算表达式来实现,但我不知道如何避免显式地将每个右侧包装到Retryable<'T>中。
我可以想象计算表达式看起来像这样:
let! x = Retryable( fun() -> GetResourceX())
etc.
我知道Monad在某种程度上是包装类型,但我希望有一种绕过它的方法。我知道我可以重载运算符,并且有一个非常简洁的语法来将操作转换为Retryable<'T>,但对我来说,这只是使重复/包装更加简洁;它仍然存在。我可以将每个函数封装为Retryable<'T>,但再次,我不认为它比在帖子顶部所做的事情(对每个操作调用retry。至少非常明确)有价值。
也许计算表达式在这里是错误的抽象,我不确定。对于这里可能有什么解决方案吗?
DoThis
抛出的异常次数超过您允许的次数会发生什么?它会让异常通过吗? - gradbot