编程技巧0001:C# 中如何一次 catch 多个异常?
在项目开发中当抛出异常时,简单的用 System.Exception,但这种会捕获所有的异常,在只想捕获已知的几个异常,然后在这里处理一些特定的业务逻辑。
代码如下:

上面的两种异常的处理逻辑是一致的,重复写了“异常处理” ,是否有办法可以只写一次呢?
解决方案
最简单的方法就是在 catch 作用域中使用 if 语句, 但在 C#6.0 之后就不需要这么麻烦了,可以直接使用新特性 异常过滤器 , 这种特性已经被 CLR 直接支持而不仅仅是 MSIL 上的一些小动作,修改后的代码如下:

上面的代码仅仅会捕获 InvalidDataException 和 ArgumentNullException 异常,当然你可以在 when 子句中弄出更复杂的语句,比如下面代码:

值得注意的是:Exception Filters 和 catch 中写 if 有着不同的语义,当第一个 Exception Filters 中的判断条件不满足或者在内部抛出了异常,代码会继续判断下一个 Exception Filters ,参考代码如下:

如果 Exception Filter 有多个 true,那么只会命中第一个。
