使用';最后尝试';不带';catch';块
本文关键字:catch 不带 最后 使用 | 更新日期: 2023-09-27 18:24:34
是否存在使用try-finally
块而不使用catch
块的情况?
您可以使用它来确保某些操作发生在try
内容之后或异常上,但当您不希望使用该异常时。
需要明确的是,这并没有掩盖例外情况。finally
块在异常向上传播到调用堆栈之前运行。
当您使用using
关键字时,您也会无意中使用它,因为它会编译成try-finally
(不是精确的转换,但为了参数起见,它已经足够接近了)。
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
在finally
中运行的代码不能保证运行,但不能保证运行的情况相当边缘-我甚至记不清了。我只记得,如果你在这种情况下,不运行finally
很可能不是你最大的问题:-)所以基本上不要担心。
Tobias的更新:如果进程被终止,finally
将不会运行。
来自Paddy的更新:在.net尝试中最终不执行时的条件。。最终阻止
你可能看到的最常见的例子是,即使代码失败,也要处理数据库连接或外部资源:
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
}
如果MyMethod2或MyMethod3抛出异常,它将被MyMethod1捕获。但是,在将异常传递给MyMethod1之前,MyMethod2中的代码需要运行清理代码,例如关闭数据库连接。
http://forums.asp.net/t/1092267.aspx?Try+without+Catch+but+with+finally+dons+t+throw+error+Why+no+syntax+error+
using
相当于try-finally
。只有当您想对finally
内部进行一些清理并且不关心异常时,才会使用try-finally
。
最佳方法将是
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}
这样做即使using
调用的清理失败,您的代码也不会失败。
当finally
不被执行时,存在一些条件。
- 如果存在任何CCD_ 16或CCD_
- 进程从外部源终止
如果您有一个在try块中创建并使用的非托管资源,则可以使用finally块来确保释放该资源。无论try块中发生了什么(例如异常),finally块都将始终执行。
例如,lock(x)语句实际上是:
System.Threading.Monitor.Enter(x);
try { ... }
finally
{
System.Threading.Monitor.Exit(x);
}
finally块将始终被调用,以确保独占锁被释放。
您需要一个finally块,无论捕获了哪些(如果有的话)异常,或者即使没有捕获到,您仍然希望在块退出之前执行一些代码。例如,您可能想要关闭一个打开的文件。
另请参见try finally
try/finaly:当您不想处理任何异常,但希望确保发生某些操作时,无论调用的代码是否引发异常。
我对C#一无所知,但似乎只要最后尝试一下,就可以更优雅地使用using语句。由于其RAII,C++甚至没有finally。
在这种情况下,您可能希望使用try finally:当您通常会使用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块。