浏览以下代码
示例:
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");
}
这可能是什么输出,以及为什么。?
首先执行哪个catch块以及为什么?
如果我在try块之后立即声明catch(Exception ex),那么它将不会编译并为其他catch块提供错误 - “前一个catch子句捕获所有异常” - 这个catch块也是如此带参数System.Exception充当主异常或主异常块..?如果是这样的原因..?
请提前通知并感谢您的帮助。
答案 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");
}