首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义异常类

自定义异常类
EN

Stack Overflow用户
提问于 2011-09-17 02:14:10
回答 4查看 900关注 0票数 1

我有一台抽象班相机。有一些派生类将处理特定类型的相机。每种类型的相机都有自己的异常,虽然其中一些根本没有异常,但它们返回了一个具有error类型的枚举。

我想知道你们是否同意这个实现:

所有特定的类都将处理它们的异常(或枚举错误类型),并将其转换为通用异常(例如: CameraException : Exception)并抛出它。

它是一个好的/推荐的实现吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-21 05:28:15

无论微软怎么说,应用层都应该定义自定义的异常类型。假设有一个抽象的WrappedCamera类,它的派生类用作CanonCamera、NikonCamera、KodakCamera等类的包装器,其未来的派生类将用作将来设计的相机类的包装器。假设一个类WrappedWaldorfCamera包装了WaldorfCamera,当它调用WaldorfCamera.GetPictureCount()时,该方法抛出异常WaldorfCamera.WrongCameraModeException。如果WrappedWaldorfCamera允许异常溢出,应用程序将如何处理它?除非应用程序假设所有未知异常类型都应该显示一条消息,但允许程序继续运行,否则应用程序无法知道WaldorfCamera.WrongCameraModeException可以安全捕获。相反,如果WrappedWaldorfCamera抛出从WrappedCamera.CleanNonConnectStateException派生的WrappedCamera.CameraModeException,应用程序将知道它应该捕获异常并处理它。

顺便说一句,为了避免任何人抱怨整个“问题”是由WaldorfCamera定义自己的异常造成的,考虑一下如果WrappedWaldorfCamera让InvalidOperationException过滤的情况。应用程序应该如何处理其中的一个?

正确的做法是让每个应用层至少定义致命和非致命异常类型--通常每种类型都有几种风格,这取决于应用程序状态(例如,CleanNonConnectStateException意味着特定的摄像头连接对象没有有效的连接;准备好处理的应用程序代码应该捕获异常,而没有准备好处理的代码应该让异常冒泡成可以处理这种情况的代码,当异常跨越另一个层边界时重新包装异常。

票数 2
EN

Stack Overflow用户

发布于 2011-09-17 02:20:12

您可能希望将错误概念统一到一个通用的CameraException类层次结构中。如果目标是抽象相机实现,那么也应该将错误抽象到这个常见的异常框架中。

如果您只有特定于实现的异常,那么对于您的类的用户来说,如果不分析细节,就很难准确地理解CameraException试图表达的内容。

我建议提供一个逻辑异常的框架,然后依赖于实现的相机逻辑将解释代码,然后创建正确的相应逻辑相机异常。

例如,如果您尝试在相机的内存、卡上执行操作,但未插入任何内容,则抛出可从CameraException继承的NoMemoryCardInCameraException

如果您真的希望这些提供程序细节可用,可以在CameraException中有一个名为Detail的属性,或者是一个抽象类,或者是具有特定于实现的细节的键值对的Dictionary。这样,如果有人真的想从提供商那里挖掘实际的错误代码、枚举等,他们可以这样做。

您的目标应该是让普通用户能够捕获逻辑异常,并在不需要了解细节的情况下适当地处理它们。

希望这能澄清一点...

票数 3
EN

Stack Overflow用户

发布于 2011-09-17 02:23:52

只有当调用者要捕获特定类型,或者如果某个调用者要知道特定类型并查看其属性时,才应该创建新的异常类型。

如果不同摄像头类型的调用者只会这样做:

代码语言:javascript
复制
try
{
    // Do something with some kind of camera
}
catch (CameraException ex)
{
    // Handle the fact that there was a camera problem
}

这样就不需要CameraException的自定义派生类型了。没有人关心抛出的是什么特定的派生类型。

事实上,如果您的调用者在抛出CameraException时与任何其他类型的异常没有什么不同,那么就不需要CameraException了。只需使用像InvalidOperationException这样的东西,并用一个信息性的Message属性抛出它:

代码语言:javascript
复制
throw new InvalidOperationException(
    String.Format("Invalid attempt to set the f-stop to {0} while in video mode",
                  this.FStop));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7448756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档