【问题标题】:Using exception filtering in c# 6.0 (with typeof()) VS. catching custom exception在 c# 6.0 (with typeof()) VS 中使用异常过滤。捕获自定义异常
【发布时间】:2018-02-20 12:23:49
【问题描述】:

我有一种管理异常处理的方法,如下所示。问题是,如果typeof 异常是我们的重点,推荐哪种方法?使用
catch (System.Exception ex) when(ex.GetType() ==typeof(ExcOneException)){...}

catch (ExcOneException ex) {...}

public T MyMethod<T>(Func<T> codeToExecute)
    {
        try
        {
            return codeToExecute.Invoke();
        }
        catch (System.Exception ex) when(ex.GetType() ==typeof(ExcOneException) )
        {
            throw new ExcOneException(ex.Message,ex);
        }
        catch (System.Exception ex)
        {
            throw new ExcTwoException(ex.Message, ex);
        }
    }  

更新:我的解决方案有 3 个项目,UI、Services 和 DataAccess。每个部分都有自己的自定义异常处理程序类。想象一下,有问题的代码在服务项目中。所有代码都应该调用这个方法来执行。如果出现ExcOneException类型的运行时错误,说明错误在服务部分,否则,应该是数据访问部分错误;因此,应该抛出 ExcTwoException。这种方法可以帮助我将错误冒泡到带有详细信息的 UI 级别。我不知道的是,在我们可以使用 C# 6 属性的情况下,当我仅对异常类型进行过滤时,哪种方法更好,使用 catch-when 或提及异常类型作为 catch 的参数?

【问题讨论】:

  • 为什么不catch (System.Exception ex) when(ex is ExcOneException))?无论如何,您都应该这样做catch (ExcOneException ex) {...}
  • 正是我想知道在这种情况下执行和性能是否有任何差异。我知道,例如,不推荐使用 if/else 来检查 catch 主体中的异常类型,因为堆栈缠绕和丢失跟踪。但我想确定上面提到的两种方法之间是否没有任何区别。
  • 当异常已经是 ExcOneException 时,不要使用 throw new ExcOneException(ex.Message,ex);。它重新创建堆栈跟踪。按照 Paulo Morgado 的建议使用 throw;

标签: c# exception exception-handling c#-6.0 custom-exceptions


【解决方案1】:

简化和可读性:

您可以使用is 过滤,而不是typeof

catch (Exception ex) when (ex is ExcOneException) { ... }

链接多个异常类型:

catch (Exception ex) when (ex is ExcOneException || ex is ExcTwoException) { ... }

【讨论】:

    【解决方案2】:

    你为什么会考虑这个?你提到性能。您是否有任何让您怀疑的测量值。

    异常过滤器用于过滤您无法按类型捕获的异常,这不是您的情况。

    在您的代码中,您也不会重新抛出捕获的异常。您正在抛出一个新异常,并将捕获的异常作为内部异常,当您想用更有意义的异常包装捕获的异常时,您会这样做。

    如果你打算重新抛出,正确的代码是:

        catch (System.Exception ex)
        {
            throw;
        }
    

    【讨论】:

    • 这不会改变我的答案。我认为过滤异常类型没有任何价值。
    • @PauloMorgado 是正确的,只是将异常扔回 UI 层不会重置堆栈跟踪,这是多层 .NET 应用程序的首选方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2018-05-30
    • 2015-06-07
    • 1970-01-01
    • 2017-05-24
    • 2011-09-22
    相关资源
    最近更新 更多