使用';最后尝试';不带';catch';块

本文关键字:catch 不带 最后 使用 | 更新日期: 2023-09-27 18:24:34

是否存在使用try-finally块而不使用catch块的情况?

使用';最后尝试';不带';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块。