【发布时间】:2017-06-11 21:52:22
【问题描述】:
场景
我有一个执行数据库操作的方法(比方说)。如果在该操作期间引发任何异常,我只想将该异常抛出给调用者。我不想在 catch 块中执行任何特定任务,假设调用者将对该异常执行它想做的任何事情。在这种情况下,哪一种是合适的异常处理技术?
try
{
// Some work that may generate exception
}
catch(Exception)
{
throw;
}
finally
{
// Some final work
}
上面的等价于下面的try/catch/finally吗?
try
{
// Some work that may generate exception
}
catch
{
throw;
}
finally
{
// Some final work
}
上面的等价于下面的try/finally吗?
try
{
// Some work that may generate exception
}
finally
{
// Some final work
}
哪一个比另一个好?应该使用哪一个?
【问题讨论】:
-
问题帖子最底部的问题很难回答,因为这3个我只能推荐底部的一个。一般来说,不建议捕获 all 异常然后简单地重新抛出它们。我假设您打算在 catch 块内处理它们,但在这种情况下,这取决于您打算做什么。如果您打算记录异常并简单地重新抛出,那么是的,捕获任何类型的异常可能有效,但在几乎所有其他情况下,您应该只捕获您知道如何捕获的异常处理。
-
此外,前 2 个与最后一个不同之处在于您没有 捕获块,但如果该捕获块只是重新抛出异常无论如何(就像你的例子一样),并且没有额外/其他处理,那么完全有 catch 块似乎是可疑的。
-
基本上,建议做什么取决于您的问题中没有的上下文。
-
@HimBromBeere 如果您问“哪一个比其他的更好”,如果有客观的方法来衡量“好”,则不必必须基于意见每个备选方案的。我的观点是,这个问题没有足够的背景来推荐任何东西,除了提出更具体的场景,很可能存在好的和可靠的建议。
-
新场景位于顶部,如果您不打算做任何事情,除了任何例外,您什么都不需要。异常将在没有您帮助的情况下传播到调用堆栈(在某些情况下跨越线程和任务边界,具体取决于所涉及的框架)。只有当您打算处理需要使用try/catch 的异常时。如果您想确保某些清理代码始终运行,则可能需要 try/finally。换句话说,对于您的特定场景,如果需要,请使用 try/finally 替代方案,或者根本不使用 try/catch/finally。
标签: c# .net exception exception-handling