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

版权声明:程序人生 https://blog.csdn.net/flysnowjava/article/details/81213513

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

普通的Catch处理

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

try

{

// do web call

}

catch(HttpException ex)

{

if(ex.WebEventCode >= 500)

{

HandleServerError(ex);

扫描二维码关注公众号,回复: 3026478 查看本文章

}

else if(ex.WebEventCode >= 400)

{

HandleNotFoundError(ex);

}

...

}

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

使用When关键字的Catch 处理

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

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> 语句中,可以评估的不仅仅是异常。这样做实际上非常有用。看看下面的例子:

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关键字

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表达式中的对象引用不能再出新的异常。

猜你喜欢

转载自blog.csdn.net/flysnowjava/article/details/81213513
今日推荐