首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# 7模式匹配

C# 7模式匹配
EN

Stack Overflow用户
提问于 2017-04-05 15:00:15
回答 2查看 12.6K关注 0票数 14

假设我有以下异常筛选器

代码语言:javascript
复制
try {
    ...
} catch (Exception e) when (e is AggregateException ae && ae.InnerException is ValueException<int> ve || e is ValueException<int> ve) {
    ...
}

我本可以简单地编写两个单独的catch块,但我想看看如何使用模式匹配特性来捕获自身或包装在AggregateException中的异常。然而,在这里,编译器抱怨ve的重新定义,这是可以理解的。我看到了模式匹配变量在相同表达式中重用的情况,如下所示:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

代码语言:javascript
复制
if (o is int i || (o is string s && int.TryParse(s, out i)) { /* use i */ }

所以也许有办法做我想做的事。还是真的有?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-05 17:28:42

不能在同一范围内两次声明ve变量。但是您可以重写异常筛选器,以便只声明一次ValueException<int>变量:

代码语言:javascript
复制
catch(Exception e) 
  when (((e as AggregateException)?.InnerException ?? e) is ValueException<int> ve)
{
   // ...
}

如果异常是直接抛出的,或者是包装到AggregateException中的,则只能捕获异常。

请记住,AggregateException的目的是将多个异常合并为一个异常对象。可以有几个内部异常,其中一些也可以是聚合异常。因此,您应该扁平化聚合异常并检查其所有内部异常。

您可以将“展开”部分放入扩展方法中,以提高代码的可读性。

票数 16
EN

Stack Overflow用户

发布于 2019-09-11 11:05:31

不如Sergey的解决方案好,但您也可以使用不同的名称并将它们合并起来:

代码语言:javascript
复制
try 
{
    ...
} catch (Exception e) 
      when (e is ValueException<int> ve1 || 
            e is AggregateException ae  
              && ae.InnerException is ValueException<int> ve2)  
{
    var exept = ve1 ?? ve2;

    // do something with exept
}

如果您处理的是InnerExceptions of ValueException或通用ValueException,那么异常也是相同的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43234892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档