【发布时间】: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