尝试在C sharp中捕获块

时间:2011-07-01 06:29:45

标签: c# asp.net

我在项目中使用 try catch和finally 块。我怀疑是...... 为什么我们需要使用finally块,实际上如果不使用finally块那么代码也会在catch块之后执行。所以我们可以在catch块之后做代码(做无资源)。 即使发生异常,这也会执行。如果我们使用最终阻止,那么有什么优势吗?

7 个答案:

答案 0 :(得分:7)

根据this之前SO帖子的回答:

  

finally块内的代码会   无论是否,都会被执行   没有例外。这来了   在某些方面非常方便   你需要的家政服务   总是像关闭连接一样运行。

答案 1 :(得分:1)

我想你正在谈论这个:

try {
  // do something that might throw exception
}
catch (Exception) {
  // take care of exception
}
finally {
  // what is the point of this?
}

如果您处理catch块中的所有可能异常,那么您可能需要finally块的唯一原因是拦截return块内的try语句

感谢@dthorpe: finally也会截取catch块内的任何异常/返回语句。

答案 2 :(得分:1)

只有在抛出异常时,代码才会在catch块中执行。

如果抛出异常,并且没有抛出异常,则代码将在finally块中执行。由于无论是否抛出异常,您都可以依赖finally块始终执行,因此最后可以使用块来清理您分配的任何资源,尤其是非托管资源,例如文件或操作系统句柄。

你提到在catch块释放资源之后依赖于代码的执行。这不是一个安全的假设,因为a)适当约束的catch块不会捕获所有异常,而只是代码需要处理的异常,以及b)catch块本身可以抛出或重新抛出异常。 catch块后面的代码可能无法执行。

如果您习惯于编写捕获所有异常并杀死它们的不合格捕获块,那么您就会滥用异常。

答案 3 :(得分:0)

如果发生异常,您应该使用finally块来取消分配非托管资源。您还可以处理GC或处理“try”中构建的任何一次性类型

答案 4 :(得分:0)

Finally即使发生exception,也会执行阻止。因此,您可以关闭Database Connection块中的Dispose或其他finally活动。

答案 5 :(得分:0)

想象一下这个用法:

String doSomething()
{
  SqlConnection conn;

  try {
    conn = new SqlConnection();

    // SQL stuff

    return result;
  }
  catch(Exception ex) { AddToLog(ex);  }
  finally {
    if (conn != null)
      conn.Dispose();
  }

  return null;
}

无论SQL部分发生什么,您都将始终正确处置。

答案 6 :(得分:0)

嗯,这实际上取决于你如何使用它,如果你只有空的catch块,那么如果你最后阻止它就没有任何区别。它非常优雅,在你处理catch块中的某些东西的同时也希望一些代码也需要在catch之后执行。

但是,try / catch / finally适用于特殊情况,需要针对最差情况进行规划,以使您的程序更加健壮。如果其中一个catch处理程序重新抛出异常,则catch块之后的代码(不在finally块中)将永远不会被执行。

由于某些特定场景中的代码很有可能无法执行,因此finally块是您执行所需关键操作的保险。您将需要识别此类情况,并且没有这样的规则,即每个try catch块必须具有finally。