c#如何同时捕获多个异常

在软件开发过程中,异常处理是不可或缺的一部分。它能够确保程序在遇到错误时能够优雅地处理,而不是简单地崩溃或中断。通过捕获和处理异常,可以为用户提供更好的体验,同时也能够更容易地定位和解决程序中的问题。

有过经验的朋友都知道,简单地捕获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 ) => {  
    	// 记录日志, 其它...  
	};
}

然后在抛出FormatExceptionOverflowExceptionArgumentNullException等异常的地方,调用定义errorHandler 表达式来处理它。

通过本文的分享,我希望相关朋友能够对C#中的异常处理有更深入的了解,并能够在自己的项目中灵活运用这些技巧。同时,也欢迎大家在评论区留言交流,分享自己的经验和看法,若有什么不对的地方,也希望大家及时指正!共同进步。

既然都看到这里了,不妨点赞支持一下呗~!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值