如何检查 catch 块中抛出的异常类型?
How to check the types of Exceptions thrown in a catch block?
我有这样的东西:
catch (Exception ex)
{
if (ex is "Exception Type")
{
}
else if (ex is SqlException)
{
}
else if
{
...
...
...
}
这在 C#
中是正确的吗?is
到底是什么意思,这是它的作用还是有其他方式?
多个catch块是一个答案(docs):
try
{
}
catch (SqlException ex)
{
...
}
catch(AnotherExceptionType ex)
{
...
}
您可以在 try
块后添加任意数量的内容。
UPD
正如对此答案的评论中所添加的那样 - 顺序很重要,因此如果您有异常层次结构,首先捕获派生的。
是的,还有一个办法。通过调用 运行 代码块时可能发生的特定异常:
try {
// Do something
}
catch(SqlException ex) {
}
catch(AnotherException ex) {
}
那么从最具体的异常开始,然后逐步实现一般异常是非常重要的。
经典选项:
try
{
return DoStuff();
}
catch (InvalidOperationException opEx)
{
return HandleInvalidOp(opEx);
}
catch (DivideByZeroException divEx)
{
return HandleDivException(divEx);
}
catch (Exception ex) // final catch-all
{
return HandleEx(ex);
}
使用模式匹配开关:
try
{
return DoStuff();
}
catch (Exception ex)
{
switch (ex)
{
case InvalidOperationException opEx:
return HandleInvalidOp(opEx);
case DivideByZeroException divEx:
return HandleDivException(divEx);
default:
return HandleEx(ex);
}
}
我有这样的东西:
catch (Exception ex)
{
if (ex is "Exception Type")
{
}
else if (ex is SqlException)
{
}
else if
{
...
...
...
}
这在 C#
中是正确的吗?is
到底是什么意思,这是它的作用还是有其他方式?
多个catch块是一个答案(docs):
try
{
}
catch (SqlException ex)
{
...
}
catch(AnotherExceptionType ex)
{
...
}
您可以在 try
块后添加任意数量的内容。
UPD 正如对此答案的评论中所添加的那样 - 顺序很重要,因此如果您有异常层次结构,首先捕获派生的。
是的,还有一个办法。通过调用 运行 代码块时可能发生的特定异常:
try {
// Do something
}
catch(SqlException ex) {
}
catch(AnotherException ex) {
}
那么从最具体的异常开始,然后逐步实现一般异常是非常重要的。
经典选项:
try
{
return DoStuff();
}
catch (InvalidOperationException opEx)
{
return HandleInvalidOp(opEx);
}
catch (DivideByZeroException divEx)
{
return HandleDivException(divEx);
}
catch (Exception ex) // final catch-all
{
return HandleEx(ex);
}
使用模式匹配开关:
try
{
return DoStuff();
}
catch (Exception ex)
{
switch (ex)
{
case InvalidOperationException opEx:
return HandleInvalidOp(opEx);
case DivideByZeroException divEx:
return HandleDivException(divEx);
default:
return HandleEx(ex);
}
}