我有一个管理异常处理的方法,如下所示。问题是,如果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的参数?
答案 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) { ... }