在软件开发过程中,异常处理是不可或缺的一部分。它能够确保程序在遇到错误时能够优雅地处理,而不是简单地崩溃或中断。通过捕获和处理异常,可以为用户提供更好的体验,同时也能够更容易地定位和解决程序中的问题。
有过经验的朋友都知道,简单地捕获System.Exception
是不被推荐的。相反,应该只捕获那些‘已知’的异常。
有时,我们可能希望在一个catch
块中同时捕获多种不同类型的异常,而不是为每个可能的异常类型都编写一个单独的catch
块。这就是“同时捕获多个异常”的含义。
现在,我们来看下面这个简单的例子:
try
{
WebId = new Guid(queryString["web"]);
}
catch (FormatException)
{
WebId = Guid.Empty;
}
catch (OverflowException)
{
WebId = Guid.Empty;
}
现在,大家可以想一个,是否有一种方法可以同时捕获这两种异常,并且只调用一次WebId = Guid.Empty
?
给定的例子相对简单,因为它只是一个Guid。但想象一下,如果你的代码中有多次修改一个对象的情况,并且这些操作可能引发异常的情况下,你想要“重置”这个对象。如何在出现异常时统一处理,同时确保非预期的异常能够被正确抛出。
说了这么多,该讲一下具体怎么做了,从C# 6.0开始,引入的异常过滤器。
catch (Exception ex) when (ex is ... || ex is ...)
那么我们就可以这么写这段代码:
try
{
WebId = new Guid(queryString["web"]);
}
catch (Exception ex) when (ex is FormatException || ex is OverflowException)
{
WebId = Guid.Empty;
}
不过,我不太喜欢将所有内容放在一行的布局方式,我个人会更倾向于将代码写成如下形式。这样的布局美观且提高了代码的可读性。
catch (Exception ex) when (
ex is FormatException ||
ex is OverflowException)
在工作中,我也发现不少程序员采用这种方式来捕获多个异常,我认为也是非常实用,希望可以给你带来参考:
catch (Exception ex)
{
if (ex is FormatException || ex is OverflowException)
{
WebId = Guid.Empty;
}
else
ExceptionDispatchInfo.Capture(ex).Throw();
}
最后,大家可以自定义一个异常处理函数,定义了一个名为errorHandler
的lambda表达式,它接受一个Exception
类型的参数ex
。在这个lambda表达式中,你可以执行任何你想要的异常处理逻辑,比如写入日志等。
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// 记录日志, 其它...
};
}
然后在抛出FormatException
、OverflowException
或ArgumentNullException
等异常的地方,调用定义errorHandler
表达式来处理它。
通过本文的分享,我希望相关朋友能够对C#中的异常处理有更深入的了解,并能够在自己的项目中灵活运用这些技巧。同时,也欢迎大家在评论区留言交流,分享自己的经验和看法,若有什么不对的地方,也希望大家及时指正!共同进步。
既然都看到这里了,不妨点赞支持一下呗~!