繁体   English   中英

自定义异常类

[英]Custom Exception class

我有一个抽象类的相机。 有一些派生类可以处理特定类型的相机。 每种类型的相机的确有其自己的异常,而其中一些根本没有异常,它们会返回一个带有错误类型的枚举。

我想知道你们是否同意这种实现方式:

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

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

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

如果只有特定于实现的异常,则类的用户将很难在不分析细节的情况下准确理解CameraException试图说的内容。

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

例如,如果您尝试对相机的内存,卡执行任何操作,但没有插入任何操作,则抛出NoMemoryCardInCameraException ,它可以从CameraException继承。

如果您确实希望这些提供程序的详细信息可用,则可以在CameraException拥有一个名为Detail的属性,或者将其作为抽象类或具有实现特定详细信息的键值对的Dictionary 这样,如果有人真的想从提供程序中挖掘实际的错误代码,枚举等,则可以。

您的目标应该是使普通用户能够捕获逻辑异常并适当地处理它们,而无需了解具体细节。

希望可以澄清一下...

仅当调用者要捕获该特定类型或某些调用者知道该特定类型并查看其属性时,才应创建新的Exception类型。

如果不同摄像机类型的呼叫者仅能做以下事情:

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属性一起抛出即可:

throw new InvalidOperationException(
    String.Format("Invalid attempt to set the f-stop to {0} while in video mode",
                  this.FStop));

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

顺便说一句,以免有人抱怨整个“问题”都是由WaldorfCamera定义了自己的异常而创建的,请考虑以下情况:WrappedWaldorfCamera允许渗透一个InvalidOperationException。 应用程序应与其中之一做什么?

正确的做法是让每个应用程序层至少定义致命和非致命的异常类型-通常根据应用程序状态定义每种异常类型(例如,CleanNonConnectStateException表示特定的相机连接对象不没有有效的连接;准备处理的应用程序代码应捕获异常,而未准备处理的应用程序代码应使异常冒泡到可以处理这种情况的代码,如果发生则重新包装异常它越过另一层边界。

转换为通用异常通常只会隐藏重要信息。
让所有异常都继承CameraException可能是一件好事,但如果不同的实现CameraExceptionCameraException则让它们实现子类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM