.Net框架的try-catch实现仅允许你捕获继承自基类“System.Exception”的类型。为什么不能使用一个名为“System.IException”的接口来实现呢?
应用场景
我们在每个API中都使用继承自System.Exception的自定义基类。只有在记录异常后才会抛出这个基类异常,因此我们可以通过如下方式轻松避免重新记录:
try
{
// Do something.
}
catch (LoggedException)
{
// Already logged so just rethrow.
throw;
}
catch (Exception ex)
{
// TODO: Log exception.
throw new LoggedException("Failed doing something.", ex);
}
这很棒,但如果你想要一个继承自另一个系统异常类型(如System.FormatException)的自定义异常,那就有些麻烦了。
现在唯一的处理方法是拥有两个自定义基类型,并且需要复制每个catch语句。
重构
如果.NET框架只是简单地寻找System.IException之类的东西,那么你可以简单地拥有一个自定义异常接口,例如CompanyName.ILoggedException,它继承System.IException,并将其实现于你所有的自定义异常类型中。因此,你的新catch代码会像这样:
try
{
// Do something.
}
catch (ILoggedException)
{
// Already logged so just rethrow.
throw;
}
catch (IException ex)
{
// TODO: Log exception.
throw new CustomException("Failed doing something.", ex);
}
这种框架实现方式有实际原因吗?还是应该在未来的.Net框架版本中请求此功能?
catch (Exception ex)
中可以直接使用is
运算符,对吧?if (ex is ILoggedException)
- xanatos