在网路上找一份叫“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) {}应该是可以捕捉一切异常的,而不是仅仅只能捕捉数据库连接异常。不知道我的理解正不正确。

解决方案 »

  1.   

    finally 
    { if (!conn.State.Equals(ConnectionState.Closed)) 
    conn.Close(); 

    =======================================
    如果conn.Close() 出错了就捕捉不到异常
      

  2.   

    正确,也不正确。所有C# Exception都继承于Exception类,catch(Exception Ex)是可以捕捉所有C#异常。说不正确呢,是因为CLR允许抛出不继承于Exception类的异常,
    如果在try中间调用了其他不是C#写的类库或本地代码,
    那的确catch(Exception Ex)不能捕捉所有的异常。要捕捉所有的异常,可以这样
    try
    {
    }
    catch
    {
      //...
      throw;       // better to re-throw
    }
      

  3.   

    Exception  是异常 是没有错的   
    但是有的时候  还会出现 error 的我是小菜鸟!   说的不好清见谅,   希望能够帮到你!
      

  4.   

    捕捉所有的异常本身不是好的编程风格。应该只对‘能预料’的,能理解的异常才尝试恢复错误。
    并不是所有异常都能恢复的,吃掉所有的异常只会掩盖存在问题的,是程序调试更困难。这也是为什么上面的例子建议重新抛出异常(throw;)的原因。
      

  5.   

    谢谢各位关注。
    谢谢 gomoku 
      

  6.   

    答案是正确的
      你首先看问题 再看答案
    获取异常 要在try{}里。test方法并没有全部try。