在IT技术中是否存在适合使用try-finally
块而不带catch
块的情况?
finally
块来确保在 try
代码段执行后或者出现异常时,执行一些操作但不消耗该异常。
需要明确的是,这并不会隐藏异常。在异常被传播到调用栈之前,finally
块会先执行。
当你使用 using
关键字时,也会无意中使用它,因为这将编译为一个 try-finally
代码块(虽然不是完全相同的转换,但是近似地说它足够接近)。try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
finally
中的代码并不保证一定会运行。但是在它不能保证运行的情况下,这种情况是相当少见的——我甚至都记不起来了。我只记得,如果你遇到这种情况,那么你最大的问题很可能不是不运行 finally
:-) 所以基本上不要太担心。
Tobias 的更新:如果进程被终止,则 finally
不会运行。
Paddy 的更新:.net try..finally 块中 finally 不执行的条件
最常见的例子就是在数据库连接或外部资源释放时,即使代码失败也要执行 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();
}
代码演示的好解释:
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
}
using
相当于 try-finally
。只有在你想要在 finally
中进行一些清理工作并且不关心异常时,才会使用 try-finally
。
最佳方法是
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}
即使被称为 using
的清理操作失败,您的代码也不会失败。
在某些情况下,finally
不会执行。
StackOverflowException
或 ExecutingEngineException
。System.Threading.Monitor.Enter(x);
try { ... }
finally
{
System.Threading.Monitor.Exit(x);
}
finally块将始终被调用以确保独占锁被释放。
当您无论捕获哪些(如果有)异常或者即使没有捕获异常也想要在块退出之前执行一些代码时,需要使用 finally 块。例如,您可能希望关闭一个打开的文件。
另请参阅 try-finally。
try/finally:当您不想处理任何异常但希望确保某些操作发生,无论被调用代码是否抛出异常时使用。
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();
}
1.我们可以使用try块而不必要catch,但我们必须使用catch/finally这两者之一。 2.我们不能单独使用try块。
try
中增加一个计数器,然后在 finally
中减少它,您无法在 using
语句中执行此操作。 - Mark A. DonohoeTry-[Catch]-Finally
可以处理所有这些,而无需创建这样的对象。 - Mark A. Donohoeusing
肯定有时机和地点,但你不能像你所说的那样做出笼统的陈述。再次强调,这是通过解决方案来定义问题,对我来说是相反的。 - Mark A. Donohoe
try
和finally
的组合使用称为 "try-finally 语句。" - DavidRR