【问题标题】:Which block is executed first when we have multiple catch for a single try block? and why?当我们对单个 try 块有多个 catch 时,首先执行哪个块?为什么?
【发布时间】:2013-08-23 12:09:56
【问题描述】:

通过下面的代码

示例:

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. 1234563带参数 System.Exception 充当主异常或主要异常块..?如果是这样,为什么..?

请提前告知并感谢您的帮助。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    第一个满足抛出的异常类型的条件(该条件还包括从该类型继承的异常类型)的第一个catch 将执行。这就是为什么您将更具体的异常类型放在列表前面而将最通用的异常类型放在底部的原因。

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

    因此,从您发布的代码来看,唯一的保证是如果您使用严格的 .NET 代码,最后一个永远不会执行,可能会在 .NET 之外生成不继承自 System.Exception 的异常。对于所有其他情况,这取决于实际执行的异常类型。

    【讨论】:

    • 感谢您的回答,我重新编辑了我的问题更具体,所以如果没有错,如果编译器在我的代码中没有找到特定的异常类型,那么它将落到主要的异常,即 System.Exception,对吧?
    • 最后一个catch可以执行:它会捕捉任何不继承自System.Exception的异常;例如,任何由不属于 .net 的代码引发的。见stackoverflow.com/questions/10805987/…
    • @AdrianWragg - 好吧,这是真的,但在这种情况下极不可能。
    【解决方案3】:

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

      catch(SqlException sqlex)
      catch(FormatException fx)
      catch(Exception ex)
      catch
    
    • 如果代码触发SqlException(或任何继承自它的异常),则其中的代码将运行。
    • 如果是FormatException,则为该块中的代码。
    • 从基类Exception 派生的所有其他异常,第三个将运行。
    • 其他任何问题(主要是非 .net 代码引发的错误),第四个。

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

    【讨论】:

    • @PrathapSVGenny 如果这些答案之一 - 不必是我的,不会被冒犯 - 回答你的问题,值得接受它,以便其他有类似问题的人可以看到什么是有用的给你。
    【解决方案4】:
                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");
                }
    

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2019-02-27
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多