有没有适合使用try-finally
无catch
块的块的情况?
Answers:
您将使用它来确保在 try
内容之后或在异常上发生,但是当您不希望使用该异常时。
只是要清楚,这不会隐藏异常。的finally
在异常传播到调用堆栈之前运行块。
当您使用using
关键字时,您也会无意中使用它,因为它会编译为try-finally
(不是精确的转换,但出于参数的考虑,它已经足够接近了)。
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
finally
不能保证在其中运行的代码能够运行,但是不能保证运行的代码是相当边缘的-我什至不记得了。我只记得,如果是那样的话,不运行finally
不是您最大的问题的机会非常大:-)因此,基本上不要流汗。
从Tobias更新: finally
如果进程被终止,将不会运行。
从Paddy更新: 最终无法在.net try..finally块中执行的条件
您可能会看到的最普遍的示例是处理数据库连接或外部资源,即使代码失败:
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
// Do stuff.
}
编译成的东西,如:
SqlConnection conn;
try
{
conn = new SqlConnection("");
// Do stuff.
}
finally
{
if (conn != null)
conn.Dispose();
}
using
等价的try-finally
。仅try-finally
当您想要对内部进行一些清理finally
并且不关心异常时,才使用。
在最好的办法将是
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}
这样做即使被调用using
失败,代码也不会失败。
在某些情况下finally
将不被执行。
StackOverflowException
或ExecutingEngineException
。希望这能回答您的疑问。
使用代码的良好解释:
void MyMethod1()
{
try
{
MyMethod2();
MyMethod3();
}
catch(Exception e)
{
//do something with the exception
}
}
void MyMethod2()
{
try
{
//perform actions that need cleaning up
}
finally
{
//clean up
}
}
void MyMethod3()
{
//do something
}
如果MyMethod2或MyMethod3引发异常,它将被MyMethod1捕获。但是,在将异常传递给MyMethod1之前,MyMethod2中的代码需要运行清理代码,例如,关闭数据库连接。
http://forums.asp.net/t/1092267.aspx?尝试+不带+抓住+但是+带+最后+ doesn + t + throw + error +为什么+不+语法+ error +
您需要一个finally块,无论捕获到哪个(如果有)异常,即使没有捕获到异常,您仍然希望在该块退出之前执行一些代码。例如,您可能要关闭打开的文件。
另请参阅try-finally
try
,然后在中减少计数器,则finally
不能在using
语句中这样做。
Try-[Catch]-Finally
无需创建此类对象即可处理所有这些。
using
但是您不能像您一样发表一揽子声明。同样,那是通过解决方案定义问题,对我而言,这是倒退的。
在这种情况下,您可能希望最终使用try:通常使用using语句的情况,但不能这样做,因为您是通过反射调用方法的。
这行不通
using (objMsg = Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("omApp.MessagingBO")))
{
}
代替使用
object objMsg = null;
try
{
objMsg
= Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("myAssembly.objBO"));
strResponse = (string)objMsg.GetType().InvokeMember("MyMethod", BindingFlags.Public
| BindingFlags.Instance | BindingFlags.InvokeMethod, null, objMsg,
new object[] { vxmlRequest.OuterXml });
}
finally
{
if (objMsg!=null)
((IDisposable)objMsg).Dispose();
}
看一下以下链接:https : //softwareengineering.stackexchange.com/questions/131397/why-use-try-finally-without-a-catch-clause
这取决于应用程序的体系结构以及您在块中执行的操作。
1.我们可以使用没有catch的try块,但我们应该使用catch / finally,其中的任何一个。2.我们不能只使用try块。
try
,并finally
为“尝试-最后 陈述。”