黑马程序员技术交流社区

标题: try-catch中关于finally的疑问 [打印本页]

作者: 神马王刚    时间: 2012-10-6 22:32
标题: try-catch中关于finally的疑问
本帖最后由 神马王刚 于 2012-10-7 15:43 编辑

Console.WriteLine("输入年龄");
            try
            {
                int age = Convert.ToInt32(Console.ReadLine());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Console.WriteLine("走到这");
            }
            Console.ReadKey();
首先上代码,完整的try-catch是包含finally的么?我们常用的只是try-catch部分,难道是因为try-catch执行完后继续执行下面的代码的话,finally写与不写没分别,就干脆省略了?还是为了让整个结构和流程看起来更清晰而加上finally和后面的语句块?finally里能释放资源?
作者: 和志强    时间: 2012-10-6 22:37
异常处理代码的作用范围用标记子句(try或begin开始的语言作用域)标示其起始,以第一个异常处理子句(catch, except, resuce等)标示其结束;可连续出现若干个异常处理子句,每个处理特定类型的异常。某些语言允许else子句,用于无异常出现的情况。更多见的是finally, ensure子句,无论是否出现异常它都将执行,用于释放异常处理所需的一些资源。
作者: 陈顺亮    时间: 2012-10-6 22:45
用于释放资源
作者: 赵雅晴    时间: 2012-10-6 23:20
首先try-catch是抓异常的,如果有异常会影响下面程序的运行,所以用,finally让程序在出异常的情况下不会中断运行,第二个好处就是在无论程序走到try还是catch里,最后都会走到finally,可以在这里释放资源
作者: 邓艳秋    时间: 2012-10-6 23:25
完整的try-catch是可以不包括finally的,但是作为一个合格的程序员,我们首先要想到的是怎么合理利用资源。
而关于处理异常的就不多说了,有了异常但不处理异常里的资源将会造成极大的浪费。所以,finally是规范,想成为一个好的程序员,请坚决使用finally.
作者: 管海鹏    时间: 2012-10-6 23:33
try{}catch(Exception ex){}
用于捕获异常的

try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}
作者: 刘俊红    时间: 2012-10-7 01:51
本帖最后由 刘俊红 于 2012-10-7 01:52 编辑

try 语句有三种不同的形式:


所以:try后面不一定必须跟finally,但是跟finally,并把善后处理的代码写在里面更符合规范。
finally本身当然不能释放资源,只是一般把包括释放资源等善后操作的语句写在里面。

作者: 潘梦军    时间: 2012-10-7 09:27
using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand cmd = new SqlCommand(SQLString, connection);
                System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
                myParameter.Value = content;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    object obj = cmd.ExecuteScalar();
                    if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return obj;
                    }
                }
                catch (System.Data.SqlClient.SqlException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
这是执行带一个存储过程参数的的SQL语句,finally用于释放资源,但是有些时候不需要释放资源的情况也可以不用finally.还是根据你用到的实际情况自己决定要不要用




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2