前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.Net CSharp语言中When关键字的用法

.Net CSharp语言中When关键字的用法

作者头像
程序你好
发布2018-07-31 17:44:42
1.3K0
发布2018-07-31 17:44:42
举报
文章被收录于专栏:程序你好

c# 6引入了when关键字。when关键字是通过某些特定标准来过滤catch块中的异常的一种方法。后来在c# 7中扩展到case语句。我们将介绍如何在异常处理中和case语句使用when关键字。

普通的Catch处理

假设您希望使用不同的标准处理相同类型的异常。一个常见的场景是HttpException。当您捕获一个HttpException时,会返回一个响应代码。根据响应代码的不同,您可能需要采取不同的操作。

代码语言:javascript
复制
try
{
// do web call
}
catch(HttpException ex)
{
if(ex.WebEventCode >= 500)
{
HandleServerError(ex);
}
else if(ex.WebEventCode >= 400)
{
HandleNotFoundError(ex);
}
...
}

如您所见,处理错误涉及catch块中的一系列if语句。这样的代码看起来很不优雅。如果涉及到嵌套异常出来会使可读性变得更加困难,这使更加容易出现问题。

使用When关键字的Catch 处理

引入when关键字,会让代码变得优雅起来。让我们使用when关键字来处理相同的逻辑。

代码语言:javascript
复制
try
{
// do web call
}
catch(HttpException ex) when (ex.WebEventCode >= 500)
{
HandleServerError(ex);
}
catch(HttpException ex) when (ex.WebEventCode >= 400)
{
HandleNotFoundError(ex);
}

将when关键字应用到相同的代码会减少嵌套。看起来更直观,所以它使catch块的逻辑更容易理解。

在编写本文时,when关键字在代码styler中没有被格式化为关键字。这恰恰也证明这个关键字并不广为人知。这很不幸,因为它在很多情况下都很有用!

When关键字不仅仅只是能判断异常

在<code>when</code> 语句中,可以评估的不仅仅是异常。这样做实际上非常有用。看看下面的例子:

代码语言:javascript
复制
public void DoRecursion(int recurseCount = 3)
{
try
{
throw new Exception("recurse until 0");
}
catch(Exception e) when (recurseCount > 3 && e.Message == "recurse until 0")
{
DoRecursion(recurseCount--);
}
}

如您所见,评估catch异常之外的其他变量是很有用的。实际上,我今天使用它来实现对API的web调用的备份。

switch Case中使用When关键字

代码语言:javascript
复制
switch (item)
{
case type variable1:
// processing...
break;
case type variable2 when predicate:
// processing...
break;
default:
// processing...
break;
}

此 switch 非彼 switch,编译后你会发现扩展的 switch 就是 as 、if 、goto 语句的组合体。同 is expressions 一样,以前我们也能实

现只是写法比较繁琐并且可读性不强。

模式匹配语法是想让我们在简单的情况下实现类似与多态一样的动态调用,即在运行时确定成员类型和调用具体的实现。

结论

您应该开始在必须检查异常以作出决定的场景中使用when关键字。我们不用太担心其他不熟悉这个关键字的开发人员。when关键字很直观,可会很快学会!但是,一定要注意在when表达式中的对象引用不能再出新的异常。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序你好 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 普通的Catch处理
  • 使用When关键字的Catch 处理
  • When关键字不仅仅只是能判断异常
  • switch Case中使用When关键字
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档