我从来没有对异常处理的工作方式完全满意,有很多异常和 try/catch 带来的表(堆栈展开等),但它似乎在这个过程中破坏了很多 OO 模型。
无论如何,这是问题所在:
假设您有一些类包装或包含网络文件 IO 操作(例如,在某处的某个特定 UNC 路径读取和写入某些文件)。由于各种原因,您不希望这些 IO 操作失败,因此,如果您检测到它们失败,则重试它们并继续重试它们,直到它们成功或达到超时。我已经有一个方便的 RetryTimer 类,我可以实例化并使用它在重试之间休眠当前线程,并确定超时时间何时结束,等等。
问题是你在这个类的几个方法中有一堆 IO 操作,你需要将它们中的每一个都包装在 try-catch / retry 逻辑中。
这是一个示例代码片段:
RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
try
{
// do some file IO which may succeed or fail
success = true;
}
catch (IOException e)
{
if (fileIORetryTimer.HasExceededRetryTimeout)
{
throw e;
}
fileIORetryTimer.SleepUntilNextRetry();
}
}
那么,如何避免为整个班级的每个文件 IO 操作重复大部分代码呢?我的解决方案是在执行传递给它的委托块的类中使用匿名委托块和单个方法。这让我可以用其他方法做这样的事情:
this.RetryFileIO( delegate()
{
// some code block
} );
我有点喜欢这个,但它还有很多不足之处。我想听听其他人如何解决这类问题。