当我们对一个try块有多个catch时,首先执行哪个块?为什么?

时间:2013-08-23 12:09:56

标签: asp.net .net c#-4.0 exception-handling

浏览以下代码

示例:

try
{
    //some code is executing..
    //1.some SqlException thrown
    //2.some FormatException thrown
    //3. other Exception thrown
}
catch(SqlException sqlex)
{
    Console.WriteLine("sqlexception is returned");
}
catch(FormatException fx)
{
    Console.WriteLine("FormatException is returned");
}
catch(Exception ex)
{
    Console.WriteLine("Mainexception is returned");
}
catch
{
    Console.WriteLine("exception without any args is returned");
}
  1. 这可能是什么输出,以及为什么。?

  2. 首先执行哪个catch块以及为什么?

  3. 如果我在try块之后立即声明catch(Exception ex),那么它将不会编译并为其他catch块提供错误 - “前一个catch子句捕获所有异常” - 这个catch块也是如此带参数System.Exception充当主异常或主异常块..?如果是这样的原因..?

  4. 请提前通知并感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

用简单的话说: catch块按顺序工作。 即根据定义的匹配异常捕获哪个catch块。 例如如果在顶部定义一个通用异常catch块,那么它将捕获所有类型的异常,并且永远不会调用其他catch块。 所以在你的例子中,Karl定义的第4个catch块永远不会被调用。

答案 1 :(得分:1)

符合条件的第一个catch(此条件也包括从类型继承的异常类型),将执行抛出的异常类型。这就是为什么你在列表的前面放置了更多特定的异常类型,在底部放置了最常见的异常类型。

在您的示例中,最后一个catch将永远不会执行,因为它上面的catch(Exception ex)将捕获所有异常类型,因为每个异常都基于System.Exception类。

因此,从您发布的代码中,唯一的保证是,如果您严格使用.NET代码,最后一个将永远不会执行,在.NET之外生成的异常可能不会从{{1}继承}。对于所有其他人,它取决于实际执行哪一个的例外类型。

答案 2 :(得分:0)

拥有多个catch语句的原因是允许您为不同类型的异常提供处理程序。所以在你的例子中:

  catch(SqlException sqlex)
  catch(FormatException fx)
  catch(Exception ex)
  catch
  • 如果代码触发SqlException(或从其继承的任何异常),则其中的代码将运行。
  • 如果是FormatException,那么该块中的代码。
  • 从基础Exception类派生的所有其他异常,第三个将运行。
  • 其他任何内容(主要是非网络代码引发的错误),第四个。

如果移动第三个代码,代码将无法编译的原因是所有内置异常都是Exception本身的子类;如果先处理Exception,那么这些处理程序永远不能运行。

答案 3 :(得分:0)

            try
            {
                //some code is executing..

            }
            catch(SqlException sqlex)
            {
                 // sql exception goes here
                Console.WriteLine("sqlexception is returned");
             }
            catch (FormatException fx)
            {
                //format exception goes here
                Console.WriteLine("FormatException is returned");
            }
            catch (Exception ex)
            {
                 // Any other or general exception goes here
                Console.WriteLine("Mainexception is returned");
            }
            catch
            {
                 //none of the exceptions for this catch
                Console.WriteLine("exception without any args is returned");
            }