using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
File.Open("dfdf.tee", FileMode.Open);
}
catch
{
Console.WriteLine("error");
}
finally
{
Console.WriteLine("file");
}
Console.WriteLine("over");//放到finally块中也会执行,在外面也会执行,好像finally是没意义的,
Console.ReadKey();
}
}
}
难以理解,既然不管有异常否finally中语句一样执行,但不要fianlly,语句放在外面一样会执行,fianlly是不是多余的?
finally是程序必须执行的.简单点的说你可以在此语句块里处理需要手工关闭或是释放的资源.
这行代码在程序正常运行的时候不管是否放到finally里面都会执行
但是要是程序出了问题 代码执行到catch块中的话 就不会继续往下执行了 放在finally后的语句就执行不到 finally就是用来保障在任何情况下都能够执行到的操作
一般用来处理正如2楼所说的那样,“此语句块里处理需要手工关闭或是释放的资源.”
如果没有异常,不到catch呢?资源释放一般在finlly里,因为无论是在try执行完毕,还是在catch执行完毕,都会到finally,不然程序就要在try里面写一次资源释放,在catch写一次释放,要写2次释放
SqlCommand cmd = new SqlCommand();
...try
{
// 执行数据库操作
// 完成后可以直接用 return 返回执行结果
}
catch
{
// 如果执行时发生错误,对错误进行处理
}
finally
{
// 无论执行成功与否 此处的代码都将被执行
cn.Close();
cn.Dispose();
cmd.Dispose();
}
貌似上面的谈论有两种看法啊?
谁给个准确的
SqlCommand cmd = new SqlCommand();
...try
{
// 执行数据库操作
// 完成后可以直接用 return 返回执行结果
}
catch
{
// 如果执行时发生错误,对错误进行处理
}
// 无论执行成功与否 此处的代码都将被执行
cn.Close();
cn.Dispose();
cmd.Dispose();
这样不是一样吗
比如你开辟了一个内存空间,然后下面运行部分功能代码,不管是否执行成功,你都会释放那部分内存空间,所以就可以把它写到finally中。
恶心18楼和16楼提醒我了,这个return很典型
catch (Exception error)
{
throw new Exception(error.Message, error);
}
在这样的catch里面, f是有意义的.因为这个语句已经指定跳出了.
区别在于:
放在finnally里的话,如果catch中的句子
Console.WriteLine("error");
引发了异常(当然这是不可能的,我说“如果”),那放在finnally里的句子仍可以被执行,否则就执行不了了(控制流直接走到下一个最近的catch,如果没有了,则程序crash)