异常传播指南(Java 中)

2024-04-15

Java 中有关于异常传播的指南吗?

什么时候向方法签名添加异常? 例如:如果仅在缺少必要的程序资源时抛出异常,并且只能在顶层处理,那么我是否可以通过使用错误方法的所有方法将其传播到使用此异常的所有方法?

有什么好的做法吗?有什么不好的做法吗?

如果我含糊其辞,我很抱歉,但我只是在寻找有关异常的编程风格的一些(一般)建议。


过去对我有帮助的指导方针包括:

  • 当方法无法处理异常时抛出异常,更重要的是,应该由调用者处理。 Servlet API 中出现了一个很好的例子 - doGet() 和 doPost() 在某些无法正确读取请求的情况下抛出 ServletException 或 IOException。这些方法都无法处理异常,但容器可以(在大多数情况下会导致 50x 错误页面)。
  • 如果方法无法处理异常,则将异常冒泡。这是上述的推论,但适用于必须捕获异常的方法。如果该方法无法正确处理捕获的异常,那么最好将其冒泡。
  • 立即抛出异常。这可能听起来很模糊,但如果遇到异常情况,那么最好抛出一个异常来指示原始故障点,而不是尝试通过错误代码处理故障,直到认为适合抛出异常的点。换句话说,尝试尽量减少异常处理与错误处理的混合。
  • 要么记录异常,要么冒泡,但不要同时执行这两种操作。记录异常通常表明异常堆栈已完全展开,表明没有发生进一步的异常冒泡。因此,不建议同时执行这两项操作,因为这通常会导致调试过程中出现令人沮丧的体验。
  • 使用子类java.lang.Exception http://download.oracle.com/javase/6/docs/api/java/lang/Exception.html(检查异常),当你排除调用者来处理异常时。如果调用者不处理异常,这会导致编译器抛出错误消息。但请注意,这通常会导致开发人员“吞下”代码中的异常。
  • 使用子类java.lang.RuntimeException http://download.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html(未经检查的异常)表示编程错误。这里推荐的异常类包括非法状态异常 http://download.oracle.com/javase/6/docs/api/java/lang/IllegalStateException.html, 非法参数异常 http://download.oracle.com/javase/6/docs/api/java/lang/IllegalArgumentException.html, 不支持的操作异常 http://download.oracle.com/javase/6/docs/api/java/lang/UnsupportedOperationException.html再次强调,必须小心使用像 NullPointerException 这样的异常类(抛出异常类几乎总是一种不好的做法)。
  • 使用异常类层次结构跨各个层传达有关异常的信息。通过实现层次结构,您可以概括调用者中的异常处理行为。例如,您可以使用像 DomainException 这样的根异常,它有几个子类,如 InvalidCustomerException、InvalidProductException 等。这里需要注意的是,如果您将每个单独的异常场景表示为单独的异常,则异常层次结构可能会很快爆炸。
  • 避免捕获无法处理的异常。很明显,但许多开发人员尝试捕获 java.lang.Exception 或 java.lang.Throwable。由于可以捕获所有子类异常,因此当捕获“全局”异常类时,应用程序的运行时行为通常会很模糊。毕竟,人们不想捕获 OutOfMemoryError - 应该如何处理这样的异常?
  • 小心包裹异常。重新抛出异常会重置异常堆栈。除非已将原始原因提供给新的异常对象,否则它将永远丢失。为了保留异常堆栈,必须向新异常的构造函数提供原始异常对象。
  • 仅在需要时将检查异常转换为未检查异常。包装异常时,可以包装已检查的异常并抛出未检查的异常。这在某些情况下很有用,特别是当目的是中止当前正在执行的线程时。但是,在其他情况下,这可能会导致一些麻烦,因为不执行编译器检查。因此,将受检异常调整为非受检异常并不意味着盲目地进行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异常传播指南(Java 中) 的相关文章

随机推荐

  • 断言:exportArchive:“Test.app”需要配置文件

    当我尝试在 Xcode9 中使用 Xcode 服务器集成持续集成时 我可以成功创建 BOT 并尝试集成 然后我总是收到类似的错误 断言 exportArchive Test app 需要配置文件 如何解决这个问题 我遇到了同样的问题 并按照
  • torch.mm、torch.matmul 和 torch.mul 有什么区别?

    阅读完 pytorch 文档后 我仍然需要帮助来理解之间的区别torch mm torch matmul and torch mul 由于我不完全理解它们 所以我无法简明地解释这一点 B torch tensor 1 1207 0 3137
  • Java 中保存最后 N 个元素的大小受限队列

    关于 Java 库的一个非常简单快速的问题 是否有一个现成的类可以实现Queue具有固定的最大大小 即它始终允许添加元素 但它会默默地删除头元素以为新添加的元素提供空间 当然 手动实现它很简单 import java util Linked
  • 如何检测 highcharts 中的缩放事件?

    是否可以检测 Highcharts 中的缩放事件 我的用例是 我有一些图表外部的状态 当用户放大其中的一部分时 我想检测 x 轴上的新时间范围并更新相应的外部状态 你有没有尝试过高图表API http api highcharts com
  • 需要帮助解决 sorl-thumbnail 错误:“‘thumbnail’不是有效的标签库:”

    我一直在绞尽脑汁试图解决这个问题 我已经尝试了一切 但我没有任何想法 我不断看到这个错误 异常值 thumbnail 不是有效的标签库 无法从 django templatetags thumbnail 加载模板库 没有名为 sorl th
  • std::initializer_list 和引用类型

    Can a std initializer list包含引用类型 右值和左值 或者是否必须使用指针或引用包装器 例如std ref EDIT 也许需要更多澄清 我有一个成员变量 std vector
  • R 中的 Unicode 下标

    我想写 sigma 2 i使用 unicode 我可以得到三分之二的方法 u03C3 U00B2 我一生都无法弄清楚如何添加下标 根据在这个网站上我得到了上标 2 的 unicode http www fileformat info inf
  • Silex - app->json() 以字符串形式返回整数数据

    我刚刚开始使用 Silex 来帮助我构建一个从 MySQL 数据库返回数据的 Restful API 以前在使用 php 和 mysql 时 我注意到 MySQL 会在我的文件中将整数作为字符串返回json encode 功能 它会在我的所
  • iTunes Connect 上的销售统计数据多久更新一次? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的应用程序今天被 Apple 接受 我正在尝试计算它已被下载了多少次 有谁知道 iTunes Con
  • npm install git+ssh 在 docker (node16) 中失败

    谁能解释一下为什么要从node 14 alpine to node 16 alpine会导致npm安装失败吗 gt 8 10 RUN mount type ssh npm i 14 14 27 npm ERR code 128 14 14
  • InProc 会话数据消失

    我大约一周前才注意到这一点 我正在存储有关用户正在玩的当前谜题的数据 www wikipediamaze com 如下所示 HttpContext Current Session Add puzzleInfo currentPuzzleIn
  • 使用 jQuery 将宽度设置为百分比

    如何使用 jQuery 将 div 的宽度设置为百分比 使用width http api jquery com width 功能 div somediv width 70 将转向 div div into div style width 7
  • 如何将CUDA时钟周期转换为毫秒?

    我想用一些代码来测量时间within我的内核需要 我已经关注了这个问题 https stackoverflow com questions 11209228 timing different sections in cuda kernel连
  • 如何将图像从黑色转换为白色,反之亦然

    我有一张黑白的 jpg 图片 我想将黑色部分转换为白色 将白色部分转换为黑色 黑色像素转换为白色 反之亦然 MATLAB并再次另存为jpg文件 我已经尝试过这段代码 但它只是在白页上给了我一条黑线 im imread Export00000
  • JPA/Hibernate + HQL/JPQL:选择带有 BigDecimal 参数的 DTO

    我们使用 JPA 和 hibernate 作为实现 假设我有以下 DTO public class SupplierInfoDto private String supplierName private BigDecimal remaini
  • iOS 11 SceneKit hitTest:选项:失败

    我在 iOS 11 上的 SceneKit 中使用 hitTest options 时遇到了困难 在地图应用程序中 我有一个地形节点 使用 hitTest options 我能够长时间通过触摸屏幕来发现地形上的一个点 它仍然可以在 iOS
  • 反应路由器和 Express 冲突

    我有我想要 React Router 处理的路径 而且我还有一个 Express API 后端 我从 React 应用程序调用它来执行一些安全的 API 调用 希望在这里提供应用程序 id 应用程序的唯一 URL 我使用 ID 从 Reac
  • 如何将 com.android.internal.telephony.ITelephony 导入到 Android 应用程序

    我想挂断来电 我检测到它然后我想挂断它 问题是这样的 com android internal telephony ITelephony没有解决 我尝试添加包com android internal telephony到我的应用程序并创建界
  • 在 Puppeteer 中获取 elementHandle 的同级元素

    我正在做 const last await page item last child 现在我很想根据最后一个元素获取前面的元素 IE const prev last prev 关于如何做到这一点有什么想法吗 Thanks 你应该使用prev
  • 异常传播指南(Java 中)

    Java 中有关于异常传播的指南吗 什么时候向方法签名添加异常 例如 如果仅在缺少必要的程序资源时抛出异常 并且只能在顶层处理 那么我是否可以通过使用错误方法的所有方法将其传播到使用此异常的所有方法 有什么好的做法吗 有什么不好的做法吗 如