C# 中如何一次 catch 多个异常?

咨询区

  • Michael Stum

在项目开发中当抛出异常时,我会简单的用 System.Exception,但这种会捕获所有的异常,我不希望大一统,我只想捕获我预知的几个异常,然后在这里处理一些特定的业务逻辑。

目前我只能这么实现,代码如下:

try
{WebId = new Guid(queryString["web"]);
}
catch (FormatException)
{WebId = Guid.Empty;
}
catch (OverflowException)
{WebId = Guid.Empty;
}

上面的两种异常的处理逻辑是一致的,我但重复写了 WebId = Guid.Empty; ,是否有办法可以只写一次呢?

回答区

  • Tamir Vered

最简单的方法就是在 catch 作用域中使用 if 语句, 但在 C#6.0 之后就不需要这么麻烦了,可以直接使用新特性 异常过滤器, 这种特性已经被 CLR 直接支持而不仅仅是 MSIL 上的一些小动作,修改后的代码如下:

try
{WebId = new Guid(queryString["web"]);
}
catch (Exception exception) when (exception is FormatException || ex is OverflowException)
{WebId = Guid.Empty;
}

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

static int a = 8;...catch (Exception exception) when (exception is InvalidDataException && a == 8)
{Console.WriteLine("Catch");
}

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

static int a = 7;
static int b = 0;...try
{throw new InvalidDataException();
}
catch (Exception exception) when (exception is InvalidDataException && a / b == 2)
{Console.WriteLine("Catch");
}
catch (Exception exception) when (exception is InvalidDataException || exception is ArgumentException)
{Console.WriteLine("General catch");
}

Output: General catch

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

static int a = 8;
static int b = 4;...try
{throw new InvalidDataException();
}
catch (Exception exception) when (exception is InvalidDataException && a / b == 2)
{Console.WriteLine("Catch");
}
catch (Exception exception) when (exception is InvalidDataException || exception is ArgumentException)
{Console.WriteLine("General catch");
}

Output: Catch.

如果你观察代码的 IL,你会发现,Exception Filter 并不是多 if 判断的语法糖,而是 MSIL 专门提供的 filter, endfilter  关键词法。

f67730a3feeb89a8b02d0a7ad69d405d.png

点评区

现代化的 C# 语法糖太多了,Michael Stum 大佬总结的很全面,学习了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

堆和堆排序

在讨论「堆排序」之前&#xff0c;先复习一下「选择排序」。 void SelectionSort(int a[], size_t n) {for (size_t i 0; i < n; i) {// 在剩余元素中找出最小的一个&#xff0c;然后与 a[i] 交换。size_t k i;for (size_t j i1; j < n; j) {if (a[j] < a[k]) {k …

Android之二维码生成和识别

二维码 1、ZXing库介绍 这里简单介绍一下ZXing库。ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。目前支持以下格式:UPC…

得罪前女友到底有多可怕?

1 多带一支笔到底有多重要&#xff08;via&#xff1a;100天用泰语撩到小哥哥&#xff09;▼2 专门为跪键盘而生&#xff08;via&#xff1a;in外设&#xff09;▼3 当表情包不再模糊▼4 新娘&#xff1a;他渣你&#xff0c;你干啥子整我&#xff01;&#xff01;&#xff0…

Asp.NET中如何一次性下载多个文件

在ASP.NET中&#xff0c;我们可以很方便的下载单个文件&#xff0c;当需要一次性下载多个文件的时候&#xff0c;如果提示用户一次一次保存的话&#xff0c;会导致用户体验特别的不好。我这里找到一种比较合理的解决方案&#xff0c;就是先把要下载的所有文件打包压缩到成一个文…

CybersecurityVentures:中小企业将是SIEM市场增长的下一波热点

CybersecurityVentures在2016Q1的一个报告中指出&#xff0c;中小企业将是SIEM市场增长的下一波热点。网安战略群发布了该报告的中文版。报告由GAIA小组的Charlie翻译&#xff0c;转载如下&#xff1a;来源&#xff1a;CybersecurityVentures官网翻译&#xff1a;盖亚(GAIA)小组…

Windows 10 版本 21H2 正式发布

微软今日宣布开始推送 Windows 10 版本 21H2。 Windows 10 版本 21H2 将作为 Windows 10 2021 年 11 月更新向运行 Windows 10 版本 2004、Windows 10 版本 20H2 和 Windows 10 版本 21H1 的电脑推出。 为保证升级效果&#xff0c;Windows 10 版本 21H2 将进行分阶段和可评估的…

Android之开发者应该收藏的优秀博客和技术网站

安居客Trinea 的个人博客 http:// www.trinea.cn codekk 一个Trinea发起的开源项目解析分享站点 微信公众号:codekk http://codekk.com/open-source-project-analysis

成功的换心手术——Windows Phone 8 发布

微软在刚刚开始的 Windows Phone 开发者峰会上正式发布了代号阿波罗的 Windows Phone 8 操作系统。虽然微软之前几乎没在公开场合提过阿波罗&#xff0c;但新系统变化的大方向早已泄漏。不过整个发布会依然充满惊喜&#xff0c;微软整整演示了一个多小时新功能&#xff0c;完全…

世上最“贵”的河:河里石头比黄金还值钱?甚至还有士兵驻守!

全世界只有3.14 % 的人关注了爆炸吧知识大家都听过世界上最长的河是尼罗河世界上最宽的河是亚马逊河但是你知道世界上最“贵”的河是哪条河吗这条河中最贵的原因不是水中有什么特殊生物也不是河里有黄金钻石仅仅是因为这里的“石头”这河里的石头可不普通大都是翡翠原石而这条河…

ASP.NET Core 跨平台图形验证码实现

概述几年前&#xff0c;大部分网站、论坛之类的是没有验证码的&#xff0c;因为对于一般用户来说验证码只是增加了用户的操作&#xff0c;降低了用户的体验。但是后来各种灌水机器人、投票机器人、恶意注册机器人层出不穷&#xff0c;大大增加了网站的负担同时也给网站数据库带…

日常管理

2019独角兽企业重金招聘Python工程师标准>>> 关于目前自己iOS项目使用的第三方开源库 1.AFNetworking 目前比较推荐的iOS网络请求组件&#xff0c;默认网络请求是异步&#xff0c;通过block回调的方式对返回数据进行处理。 2.FMDB 对sqlite数据库操作进行了封装&…

关于input type=file 限制文件上传类型

HTML <input> 标签的 accept 属性 <input type"file" name"pic" id"pic" accept"image/gif, image/jpeg" />accept 的取值是 MIME_type列出素有MIME_type的取值&#xff1a;下列信息摘自w3cschool MIME 类型 MIME (Multip…

System Information for Windows

运行平台&#xff1a;Windows软件授权&#xff1a;自由软件软件大小&#xff1a;1.76MBSystem Information for Windows是一款功能非常强大的系统信息管理工具,除了可查看电脑中所有的软硬件信息,网络信息等这些基本功能外,还可以查看电脑中所有软件的注册信息,包括IE和 Firefo…

Android之android studio如何把项目分享到github并提修改的代码到Github

android studio如何提交代码到Github 第一步、下载git 第二步:在android studio指定git路径 File->Settings 测试Git是否可用

清华伯克利造出机械小强:承重200万倍踩不死,跑得和真蟑螂一样快

全世界只有3.14 % 的人关注了爆炸吧知识打不死的小强&#xff0c;真的是太讨厌了&#xff01;既然打不死&#xff0c;那……干脆仿造一个出来&#xff0c;为我所用&#xff0c;岂不是爽歪歪&#xff1f;还真有人仿造成功了&#xff0c;最新的一期Science Robotics&#xff0c;就…

RowVersion字段从SqlServer到PostgreSQL的迁移

SQL Server 有个列是rowversion&#xff0c;之前是timestamp&#xff0c;因此这两个关键字在SQL server中是同义词&#xff0c;不过目前timestamp处在废弃阶段&#xff0c;因此我们最好使用rowversion来代替它。而在数据库迁移时&#xff0c;因为使用到该类型&#xff0c;因此要…

支付宝手机支付

1 在 "商家服务"开通"移动支付" 2 创建应用

java序列化有什么用_java中序列化的作用

一 什么叫序列化通俗点讲&#xff1a;它是处理对象流的一种机制&#xff0c;即可以很方便的保存内存中java对象的状态&#xff0c;同时也为了方便传输。二 序列化有什么作用1.方便传输&#xff0c;速度快&#xff0c;还很安全&#xff0c;被调用方序列化&#xff0c;调用方反序…

zk 08之:Curator之一:zk客户端Curator

Curator是Netflix公司开源的一个Zookeeper客户端&#xff0c;与Zookeeper提供的原生客户端相比&#xff0c;Curator的抽象层次更高&#xff0c;简化了Zookeeper客户端编程。 它包含以下几个组件&#xff1a; ComponentdescriptionRecipesImplementations of some of the common…

decimal,float和double的区别

一直很奇怪C#的预定义数据类型中为什么加了一个decimal&#xff0c;有float和double不就够了吗&#xff1f;今天来挖一挖。 浮点型 Name CTS Type De script ion Significant Figures Range (approximate) float System.Single 32-bit single-precision f…