Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception 编写自定义异常类时应考虑哪些因素?_Exception_Oop - Fatal编程技术网

Exception 编写自定义异常类时应考虑哪些因素?

Exception 编写自定义异常类时应考虑哪些因素?,exception,oop,Exception,Oop,自定义异常类什么时候最有价值? 是否存在应使用或不应使用的情况?有什么好处 相关问题: 我是一个极简主义者,只有当调用代码必须显式地响应所发生的特定条件时,才会创建一个自定义异常。对于所有其他情况,我将使用最合适的.NET库异常。例如ArgumentNullException、InvalidOperationException,当您需要以某种方式区分一个异常和其他异常时。就是这样,真的。当然,您也可以创建一个异常类,该类使用枚举来区分其原因 当您希望传递额外信息时,这非常容易看到。传递该信息

自定义异常类什么时候最有价值?
是否存在应使用或不应使用的情况?有什么好处

相关问题:


  • 我是一个极简主义者,只有当调用代码必须显式地响应所发生的特定条件时,才会创建一个自定义异常。对于所有其他情况,我将使用最合适的.NET库异常。例如ArgumentNullException、InvalidOperationException,当您需要以某种方式区分一个异常和其他异常时。
    就是这样,真的。当然,您也可以创建一个异常类,该类使用枚举来区分其原因

    当您希望传递额外信息时,这非常容易看到。传递该信息的唯一原因是您希望以后能够获取该信息,因此您希望知道该类型,以便可以从该类型而不是其他类型检索信息

    <>在C++中,也许还有其他一些语言,你也可能会有一个异常。这将允许区分类型,并可能在将来转换为自定义类。

    如前所述,首先查找适当的框架异常,并且只在您真正计划捕获它们的地方使用异常(特别是自定义异常)

    我使用一个包含UserMessage属性的自定义异常类,以便在可能的情况下用普通语言将问题传播给用户

    如果您正在使用.NET,请签出。有趣的是,文档中有关于ApplicationException的使用:

    如果您正在设计应用程序 这需要建立自己的机制 例外情况,建议您导出 来自异常的自定义异常 班级。原来以为 自定义异常应派生自 ApplicationException类; 然而,在实践中,这并没有得到证实 发现能增加显著价值。对于 更多信息,请参阅最佳实践 用于处理异常


    不久前,我写了一篇博客。这不是很长,但可能太长,粘贴在这里,所以请原谅我只是链接。它应该涵盖您的问题,即为什么存在不同的异常类型,以及如何知道是否需要创建自定义异常。

    我使用自定义异常的主要原因是使用多个提供程序进行封装:从SqlDataAccess层泄漏SqlException,NetworkDataAccess层之外的SocketException使调用代码依赖于您的应用程序的细节
    实施最好将它们包装到DataAccessException或其他东西中。

    我认为简单的答案是“当没有现成的异常恰当地表示异常情况时,创建一个自定义异常。”

    我也有一个第二条规则:“只需创建一个自定义异常,如果您希望开发人员能够处理异常。”如果您不将异常视为可恢复条件,则创建新异常没有意义。在该上下文中抛出InvalidOperationException更有效

    编辑:最后写了一篇关于这个主题的博文:

    问自己的问题:
  • 谁会抓住它?如果没有,那么您实际上不需要自定义异常
  • 你要把它扔到哪里?是否有足够的上下文可用,或者在异常对最终捕获者有用之前,您是否需要捕获并重新抛出多次
  • 你为什么要扔它?因为您捕获了异常并需要附加附加信息?因为您在某些数据中遇到了不可恢复的错误,需要将具体信息反馈给客户端代码?因为你喜欢扔东西
  • 例外情况是什么?不是什么原因造成的,而是从捕手的角度来看是什么?他们可以修复并重试的东西?他们不应该重试的事情?他们应该通知用户什么?他们应该附加上下文信息然后重新抛出的东西?什么决定了你需要传递的信息,如果有的话
  • 戒律:
  • 不要把时间浪费在永远不会被捕获的自定义异常上
  • 不要“双重”异常:每个自定义异常类型都应该有一个定义良好的案例,可以并且应该被捕获;不匹配的异常应该被分解成它们自己的自定义类型(而不是强制catcher将条件逻辑构建到单个
    catch()
    子句中)
  • 除非您有充分的理由不这样做,否则始终允许附加来自先前捕获的异常的内部异常/数据。失去上下文很少有帮助

  • 格雷格,我读了你的博文,认为你可以把最后一部分复制到这里的回复中。虽然大多数的回答往往不超过一个段落,但没有什么能阻止你写得更多:一些深入的回答可能比许多简短的回答更有效