在c#6.0中使用异常过滤(使用typeof())VS。捕捉自定义异常

时间:2017-09-12 06:42:11

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

我有一个管理异常处理的方法,如下所示。问题是,如果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。每个部分都有自己的自定义Exception-Handler类。想象一下,有问题的代码是在服务项目中。所有代码都应调用此方法执行。如果有任何类型为ExcOneException的运行时错误,则表示错误在服务部分,否则,数据访问部分应该有错误;所以,应该抛出ExcTwoException。这种方法可以帮助我将错误冒充到UI级别并提供详细信息。我不知道的是,在我们可以使用C#6属性的情况下,当我只对异常类型进行过滤时,哪种方法更好,使用catch-when或提及异常类型作为catch的参数?

2 个答案:

答案 0 :(得分:1)

为什么你会考虑这个?你提到了表现。你有任何让你怀疑的测量。

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

在您的代码中,您也不会重新抛出捕获的异常。您正在抛出一个新异常,并将捕获的异常作为内部异常,当您想要使用更有意义的异常包装捕获的异常时,就会执行此操作。

如果你打算重新投掷,正确的代码是:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell : Product_PriceTableViewCell = tableView.dequeueReusableCell(withIdentifier: "product_priceCell") as! Product_PriceTableViewCell
  cell.configureCell(row: indexPath.row)
  return cell   
}

答案 1 :(得分:1)

简化和易读性:

您可以使用is而不是typeof进行过滤:

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

绑定多种异常类型:

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