A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 神马王刚 中级黑马   /  2012-10-6 22:32  /  2302 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 神马王刚 于 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里能释放资源?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

倒序浏览
异常处理代码的作用范围用标记子句(try或begin开始的语言作用域)标示其起始,以第一个异常处理子句(catch, except, resuce等)标示其结束;可连续出现若干个异常处理子句,每个处理特定类型的异常。某些语言允许else子句,用于无异常出现的情况。更多见的是finally, ensure子句,无论是否出现异常它都将执行,用于释放异常处理所需的一些资源。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
用于释放资源
回复 使用道具 举报
首先try-catch是抓异常的,如果有异常会影响下面程序的运行,所以用,finally让程序在出异常的情况下不会中断运行,第二个好处就是在无论程序走到try还是catch里,最后都会走到finally,可以在这里释放资源

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
完整的try-catch是可以不包括finally的,但是作为一个合格的程序员,我们首先要想到的是怎么合理利用资源。
而关于处理异常的就不多说了,有了异常但不处理异常里的资源将会造成极大的浪费。所以,finally是规范,想成为一个好的程序员,请坚决使用finally.

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
try{}catch(Exception ex){}
用于捕获异常的

try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘俊红 于 2012-10-7 01:52 编辑

try 语句有三种不同的形式:
  • 一个 try 块后接一个或多个 catch 块。
  • 一个 try 块后接一个 finally 块。
  • 一个 try 块后接一个或多个 catch 块,后面再跟一个 finally 块。


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

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
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.还是根据你用到的实际情况自己决定要不要用

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马