gpt4 book ai didi

java - 异常传播指南(Java)

转载 作者:IT老高 更新时间:2023-10-28 20:44:14 28 4
gpt4 key购买 nike

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

什么时候在方法签名中添加异常?
例如:如果一个异常只在缺少必要的程序资源时抛出,并且只能在顶层处理,我是否通过所有使用 erring 方法的方法通过所有使用此异常的方法传播它?

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

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

最佳答案

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

  • 方法无法处理异常时抛出异常 ,更重要的是,应该由调用者处理。一个很好的例子恰好出现在 Servlet API 中 - doGet() 和 doPost() 在某些无法正确读取请求的情况下抛出 ServletException 或 IOException。这些方法都无法处理异常,但容器可以(在大多数情况下会导致 50x 错误页面)。
  • 如果方法无法处理异常,则冒泡异常 .这是上述的推论,但适用于必须捕获异常的方法。如果该方法无法正确处理捕获的异常,则最好对其进行冒泡。
  • 立即抛出异常 .这可能听起来很模糊,但如果遇到异常情况,那么抛出一个指示原始故障点的异常是一个好习惯,而不是尝试通过错误代码处理故障,直到一个点被认为适合抛出异常.换句话说,尽量减少混合异常处理和错误处理。
  • 要么记录异常,要么冒泡,但不要同时做 .记录异常通常表明异常堆栈已完全展开,表明没有发生进一步的异常冒泡。因此,不建议同时进行这两项操作,因为这通常会导致令人沮丧的调试体验。
  • 使用 java.lang.Exception 的子类(checked exceptions),当你除了调用者处理异常 .如果调用者不处理异常,这会导致编译器抛出错误消息。不过要注意,这通常会导致开发人员“吞下”代码中的异常。
  • 使用 java.lang.RuntimeException 的子类(未经检查的异常)发出编程错误信号 .这里推荐的异常类包括 IllegalStateException , IllegalArgumentException , UnsupportedOperationException等等。同样,必须小心使用像 NullPointerException 这样的异常类(抛出一个几乎总是一种不好的做法)。
  • 使用异常类层次结构来传达有关跨不同层的异常的信息 .通过实现层次结构,您可以概括调用者中的异常处理行为。例如,您可以使用像 DomainException 这样的根异常,它有几个子类,如 InvalidCustomerException、InvalidProductException 等。这里的警告是,如果您将每个单独的异常场景表示为一个单独的异常,您的异常层次结构可能会很快爆炸。
  • 避免捕获您无法处理的异常 .很明显,但很多开发人员试图捕获 java.lang.Exception 或 java.lang.Throwable。由于可以捕获所有子类异常,因此在捕获“全局”异常类时,应用程序的运行时行为通常是模糊的。毕竟,人们不想捕获 OutOfMemoryError - 应该如何处理这样的异常?
  • 小心包裹异常 .重新抛出异常会重置异常堆栈。除非原始原因已提供给新的异常对象,否则它将永远丢失。为了保留异常堆栈,必须向新异常的构造函数提供原始异常对象。
  • 仅在需要时才将已检查的异常转换为未检查的异常 .包装异常时,可以包装已检查的异常并抛出未检查的异常。这在某些情况下很有用,特别是当意图中止当前正在执行的线程时。但是,在其他情况下,这可能会引起一些痛苦,因为不会执行编译器检查。因此,将已检查的异常改编为未检查的异常并不是盲目的。
  • 关于java - 异常传播指南(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551221/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com