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是不是多余的?

解决方案 »

  1.   

    你代码里的没有意思.
    finally是程序必须执行的.简单点的说你可以在此语句块里处理需要手工关闭或是释放的资源.
      

  2.   

    Console.WriteLine("over");//放到finally块中也会执行,在外面也会执行,好像finally是没意义
    这行代码在程序正常运行的时候不管是否放到finally里面都会执行 
    但是要是程序出了问题 代码执行到catch块中的话 就不会继续往下执行了 放在finally后的语句就执行不到 finally就是用来保障在任何情况下都能够执行到的操作
      

  3.   

    在处理异常的时候,finally不是必须的。
    一般用来处理正如2楼所说的那样,“此语句块里处理需要手工关闭或是释放的资源.”
      

  4.   

    不好,就算执行了catch块,也会继续的,不信你试试
      

  5.   

    我不用finally,在catch后面写一样能释放资源,它好像还是多余的
      

  6.   

    有相同疑问,我一般没用finally
      

  7.   

    很好理解啊,try{}catch{}finally{}是一个整体,你可以在一个方法里面写多个try{}catch{}finally{},所以你上面的代码,finally{}后的语句要执行,很正常啊
      

  8.   


    如果没有异常,不到catch呢?资源释放一般在finlly里,因为无论是在try执行完毕,还是在catch执行完毕,都会到finally,不然程序就要在try里面写一次资源释放,在catch写一次释放,要写2次释放
      

  9.   

    我是指catch块后面释放,不是里面
      

  10.   

    finally 的作用是,无论操作是否成功,程序都将执行的代码段!打个比方:SqlConnection cn = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    ...try
    {
        // 执行数据库操作
         // 完成后可以直接用 return 返回执行结果
    }
    catch
    {
        // 如果执行时发生错误,对错误进行处理
    }
    finally
    {
        // 无论执行成功与否 此处的代码都将被执行
        cn.Close();
        cn.Dispose();
        cmd.Dispose();
    }
      

  11.   

    如果有异常出现的话,try{}catch{}finally{}后面的代码是否会被执行?
    貌似上面的谈论有两种看法啊?
    谁给个准确的
      

  12.   

    finally 语句和try 一起用,不管try里面是否发生异常,都必须执行finally 里面的语句如果,try 里面遇见return 语句,那么程序不会先执行return 语句,会执行finally里面的语句然后再返回
      

  13.   

    SqlConnection cn = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    ...try
    {
        // 执行数据库操作
         // 完成后可以直接用 return 返回执行结果
    }
    catch
    {
        // 如果执行时发生错误,对错误进行处理
    }
        // 无论执行成功与否 此处的代码都将被执行
        cn.Close();
        cn.Dispose();
        cmd.Dispose();
    这样不是一样吗
      

  14.   

    16楼的写清楚了啊,就是反正它都要执行的。
    比如你开辟了一个内存空间,然后下面运行部分功能代码,不管是否执行成功,你都会释放那部分内存空间,所以就可以把它写到finally中。
      

  15.   

    哈哈
    恶心18楼和16楼提醒我了,这个return很典型
      

  16.   

    语义上的问题谁的职责就给谁你拉屎就你自己来擦PP,为啥要别人的来帮你对于代码也是一样,t-c-f是个完整语义,改在自己内部完成的就自己完成,外部代码没必要为你收拾残局
      

  17.   


    catch (Exception error)
    {
          throw new Exception(error.Message, error);
    }
    在这样的catch里面, f是有意义的.因为这个语句已经指定跳出了.
      

  18.   


    区别在于:
    放在finnally里的话,如果catch中的句子
    Console.WriteLine("error");
    引发了异常(当然这是不可能的,我说“如果”),那放在finnally里的句子仍可以被执行,否则就执行不了了(控制流直接走到下一个最近的catch,如果没有了,则程序crash)
      

  19.   

    finally块在goto retrun break contnuite等跳转指令后面也会执行.