1

浏览下面的代码

例子:

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子句捕获所有异常”-这个带有参数System.Exception的catch块也是如此作为主异常或主要异常块..?如果是这样,为什么..?

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

4

4 回答 4

2

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

于 2013-08-23T12:22:58.147 回答
1

首先catch满足抛出的异常类型的标准(该标准还包括从该类型继承的异常类型)将执行。这就是为什么您将更具体的异常类型放在列表的前面,而将最通用的异常类型放在底部。

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

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

于 2013-08-23T12:16:54.983 回答
0

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

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

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

于 2013-08-23T12:17:02.500 回答
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");
            }
于 2013-08-23T12:21:44.060 回答