在C#6.0(typeof())中使用异常过滤VS.捕获自定义异常



我有一种管理异常处理的方法。问题是,如果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,服务和DataAccess。每个部分都有其自己的自定义异常手术类。想象一下,有关的代码在服务项目中。所有代码均应调用此方法进行执行。如果具有ExconeException类型的运行时错误,则意味着该错误在服务部分,否则,数据访问部件中应该存在错误;因此,应抛出Exctwoexception。这种方法可以帮助我将错误降至UI级别,并提供详细信息。我不知道的是,在我们可以使用C#6属性的情况下,当我仅在异常类型上进行过滤时,哪种方法是更好的,当或提及异常类型作为捕获的参数时,哪种方法是更好的?

简化&amp;可读性:

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

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

链多种异常类型:

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

您为什么要考虑?您提到性能。您是否有任何使您可疑的测量值。

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

在您的代码中,您也不会重新捕获捕获的例外。您正在抛出一个新的例外例外,这是一个内部例外,这就是您想用更有意义的例外情况包裹的例外。

如果您打算重新启动,则正确的代码是:

    catch (System.Exception ex)
    {
        throw;
    }

最新更新