在网路上找一份叫“C#面试题”的博客,其中有一题是这样的
7、分析以下代码。(10)
public static void test(string ConnectString) { System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
conn.ConnectionString = ConnectString;
try {
conn.Open();
…….
}
catch(Exception Ex)
{
MessageBox.Show(Ex.ToString());
}
finally
{ if (!conn.State.Equals(ConnectionState.Closed))
conn.Close();
}
}请问 :以上代码所使用的异常处理方法,是否所有在test方法内的异常都可以被捕捉并显示出来? 答:只可以捕捉数据库连接中的异常吧. (finally中,catch中,如果有别的可能引发异常的操作,也应该用try,catch。所以理论上并非所有异常都会被捕捉。) --------------------------------------对于这个答案,我认为是错误的,我没有在vs测试,但根据我所知道的知识,Exception类所有异常类的基类,那么catch(Exception Ex) {}应该是可以捕捉一切异常的,而不是仅仅只能捕捉数据库连接异常。不知道我的理解正不正确。
7、分析以下代码。(10)
public static void test(string ConnectString) { System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
conn.ConnectionString = ConnectString;
try {
conn.Open();
…….
}
catch(Exception Ex)
{
MessageBox.Show(Ex.ToString());
}
finally
{ if (!conn.State.Equals(ConnectionState.Closed))
conn.Close();
}
}请问 :以上代码所使用的异常处理方法,是否所有在test方法内的异常都可以被捕捉并显示出来? 答:只可以捕捉数据库连接中的异常吧. (finally中,catch中,如果有别的可能引发异常的操作,也应该用try,catch。所以理论上并非所有异常都会被捕捉。) --------------------------------------对于这个答案,我认为是错误的,我没有在vs测试,但根据我所知道的知识,Exception类所有异常类的基类,那么catch(Exception Ex) {}应该是可以捕捉一切异常的,而不是仅仅只能捕捉数据库连接异常。不知道我的理解正不正确。
{ if (!conn.State.Equals(ConnectionState.Closed))
conn.Close();
}
=======================================
如果conn.Close() 出错了就捕捉不到异常
如果在try中间调用了其他不是C#写的类库或本地代码,
那的确catch(Exception Ex)不能捕捉所有的异常。要捕捉所有的异常,可以这样
try
{
}
catch
{
//...
throw; // better to re-throw
}
但是有的时候 还会出现 error 的我是小菜鸟! 说的不好清见谅, 希望能够帮到你!
并不是所有异常都能恢复的,吃掉所有的异常只会掩盖存在问题的,是程序调试更困难。这也是为什么上面的例子建议重新抛出异常(throw;)的原因。
谢谢 gomoku
你首先看问题 再看答案
获取异常 要在try{}里。test方法并没有全部try。