【发布时间】:2010-09-05 07:37:16
【问题描述】:
我从来没有对异常处理的工作方式完全满意,有很多异常和 try/catch 带来的问题(堆栈展开等),但它似乎打破了很多 OO 模型过程。
不管怎样,问题来了:
假设您有一些类包装或包含网络文件 IO 操作(例如,在某处的某个特定 UNC 路径读取和写入某个文件)。出于各种原因,您不希望这些 IO 操作失败,因此,如果您检测到它们失败,则重试它们并继续重试它们,直到它们成功或达到超时。我已经有一个方便的 RetryTimer 类,我可以实例化并使用它在重试之间休眠当前线程,并确定超时时间何时结束,等等。
问题是你在这个类的几个方法中有一堆IO操作,你需要把它们都包装在try-catch/retry逻辑中。
这是一个示例代码sn-p:
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
} );
我有点喜欢这个,但它还有很多不足之处。我想听听其他人如何解决这类问题。
【问题讨论】:
-
仅供参考:almost always better 只是
throw;而不是throw e; -
我想知道:当被问到这个问题时,C# 3 是最新的。在 C# 8 之前有什么变化(当前版本为 1/16/20)?
标签: c# exception error-handling