无论finally块中的内容是什么,它总是被执行(几乎),那么将代码封闭到它或不封闭它之间有什么区别呢?


当前回答

我将用一个文件读取器例外的例子来解释finally的使用

最后不用了

尝试{ strReader = new StreamReader(@"C:\Ariven\Project\Data.txt"); Console.WriteLine (strReader.ReadeToEnd ()); StreamReader.Close (); } catch(例外ex) { Console.WriteLine (ex.Message); }

在上面的例子中,如果名为Data.txt的文件丢失,将抛出一个异常并将被处理,但是名为StreamReader.Close()的语句;永远不会被执行。 因此,与reader相关的资源从未被释放。

为了解决上述问题,我们使用最后

strReader = null; 尝试{ strReader = new StreamReader(@"C:\Ariven\Project\Data.txt"); Console.WriteLine (strReader.ReadeToEnd ()); } catch(异常ex){ Console.WriteLine (ex.Message); } 最后{ if (strReader != null){ StreamReader.Close (); } }

快乐编码:)

注意: “@”用于创建逐字字符串,避免出现“Unrecognized转义序列”错误。 符号@意味着从字面上读取该字符串,而不解释控制字符。

其他回答

啊…我想我明白你的意思了!我花了一点时间……你可能想知道“为什么把它放在finally块中,而不是放在finally块之后,并且完全在try-catch-finally之外”。

例如,这可能是因为抛出错误时您正在停止执行,但您仍然希望清理资源,例如打开的文件、数据库连接等。

假设您需要将光标设置回默认指针,而不是等待(沙漏)光标。如果在设置光标之前抛出异常,并且没有完全崩溃应用程序,则可能会留下一个令人困惑的光标。

任何时候你使用非托管代码请求,如流读取器,db请求等;你想要捕获异常,然后使用try catch finally并在finally中关闭流,数据读取器等,如果你不这样做,当它出错时连接不会被关闭,这对db请求来说真的很糟糕

 SqlConnection myConn = new SqlConnection("Connectionstring");
        try
        {
            myConn.Open();
            //make na DB Request                
        }
        catch (Exception DBException)
        {
            //do somehting with exception
        }
        finally
        {
           myConn.Close();
           myConn.Dispose();
        }

如果您不想捕获错误,请使用

 using (SqlConnection myConn = new SqlConnection("Connectionstring"))
        {
            myConn.Open();
            //make na DB Request
            myConn.Close();
        }

如果有错误,连接对象将被自动处理,但您没有捕获错误

最后,语句甚至可以在返回后执行。

private int myfun()
{
    int a = 100; //any number
    int b = 0;
    try
    {
        a = (5 / b);
        return a;
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
        return a;
    }

 //   Response.Write("Statement after return before finally");  -->this will give error "Syntax error, 'try' expected"
    finally
    {
      Response.Write("Statement after return in finally"); // --> This will execute , even after having return code above
    } 

    Response.Write("Statement after return after finally");  // -->Unreachable code
}

最后,如:

try {
  // do something risky
} catch (Exception ex) {
  // handle an exception
} finally {
  // do any required cleanup
}

是try. catch块之后执行代码的保证机会,而不管try块是否抛出异常。

这使得它非常适合于释放资源、db连接、文件句柄等。