当前位置: 代码迷 >> C# >> C#使用using话语后,在其中间可以使用try,catch语句吗
  详细解决方案

C#使用using话语后,在其中间可以使用try,catch语句吗

热度:42   发布时间:2016-05-05 03:21:35.0
C#使用using语句后,在其中间可以使用try,catch语句吗?
        public static object GetSingle(string SQLString, OleDbParameter[] cmdParms, bool isProc = false)
        {
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                using (OleDbCommand cmd = CreateCommand(connection, SQLString, cmdParms, isProc))
                {
                    try
                    {
                        object obj = cmd.ExecuteScalar();
                       if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (System.Data.OleDb.OleDbException e)
                    {
                        throw new Exception(e.Message);
                    }
                }
            }
        }
我的疑问是如果抛出异常,执行throw语句后,using语句还会自动释放OleDbConnection 和OleDbCommand 吗?还是必须在finally语句里手动释放?
------解决思路----------------------
using里的东西总是会释放的,不管是有异常还是return
------解决思路----------------------
会释放。

但是写
                    catch (System.Data.OleDb.OleDbException e)
                    {
                        throw new Exception(e.Message);
                    }

这是干啥?故意让vs的调试器不能专注地定位到调试语句和调用堆栈上?还是不想让程序员调试bug时看到InnerException?

否则你捕获错误,然后抛出一个e.Message信息,这样不但是画蛇添足(没有完全隐瞒异常反而)重复抛出异常而且也丧失了及时调试bug的能力啊?!
------解决思路----------------------
这里的using 本质就是try catch  你可以百度一下

另外 这段代码很多余
catch (System.Data.OleDb.OleDbException e)
                    {
                        throw new Exception(e.Message);
                    }
------解决思路----------------------
using是一个语法糖,本身它会转换成一个try finally
而调用dispose是在finally中,所以不要担心。
------解决思路----------------------
你可以用反编译工具类似于reflector看一下using编译后的代码 一目了然~~~~
------解决思路----------------------
我对于
 
                    catch (System.Data.OleDb.OleDbException e)
                    {
                        throw new Exception(e.Message);
                    }

这类代码的问题,与using本身无关,但是与你的问题背后的一些东西有关。

有些人说“为了能够知道是哪一段代码有问题,所以需要这样写try...catch”。这纯粹是错误的方法宣传。当你的测试遇到异常时,你的vs进入调试状态中断状态时,你不但可以看到Exception、InnerException等等而且需要看调用堆栈,需要双击调用堆栈来返回至少1层(有时候需要7、8层)调用入口去查看所经历的代码,并且调试入口代码的变量值。

而那种说“写try...catch是为了更好地知道代码出错位置”的人,显然没有想帮别人进行这样的正规的调试训练,而是只想着发布后的产品在打印异常信息时的方便。我们不能为了发布后对用户隐藏真实的异常信息,而让我们再发、测试、调试时丧失调试能力。

你会发现using结构在抛出异常时仍然支持vs调试,而根本没有搞什么类似 
throw new Exception(e.Message);
这种隐瞒异常、忽略真实的异常语句(和调试可能性)、重复抛出异常的语句。而你特意加上这条语句,目的是要干什么呢?
------解决思路----------------------
这就不是“可以不可以使用try...catch”的问题。这就好像你问“在百货商场里能不能俩人吵架啊”?这时候人家就要问你“吵架干慢啊?是甲亢造成的么?”