不建议简单地抓住 System.Exception。相反,仅应捕获“已知”异常。
现在,这有时会导致不必要的重复代码,例如:
try
{
WebId = new Guid(queryString["web"]);
}
catch (FormatException)
{
WebId = Guid.Empty;
}
catch (OverflowException)
{
WebId = Guid.Empty;
}
我想知道:有没有一种方法可以捕获这两个异常并且只 WebId = Guid.Empty 调用一次?
给定的示例非常简单,因为它只是一个Guid。
但是,请想象一下代码中您多次修改对象的情况,并且如果其中一种操作以预期的方式失败,则您想“重置” object。但是,如果有意外的例外,我仍然想将其捕获。
参考解决方案:
捕捉System.Exception并打开类型:
catch (Exception ex)
{
if (ex is FormatException || ex is OverflowException)
{
WebId = Guid.Empty;
return;
}
throw;
}
从.NET 4.0开始,代码可以重写为:
Guid.TryParse(queryString["web"], out WebId);
TryParse绝不会引发异常,如果格式错误,则将WebId设置为,则返回false Guid.Empty。
从C#7开始,您可以避免在单独的行上引入变量:
Guid.TryParse(queryString["web"], out Guid webId);
相关阅读 >>
system.threading.threadabortexception: 正在中止线程
更多相关阅读请进入《异常》频道 >>
C#高级编程(第11版) C# 7 & .NET Core 2.0(.NET开发经典名著)
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。