有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的重定向异常

在java中,有可能重新抛出异常,但这有什么好处


共 (6) 个答案

  1. # 1 楼答案

    有时,您希望某个方法引发特定类型的异常,但很少有实例会导致该方法内引发其他异常。我经常用我想要的异常包装因果异常,然后重新调用想要的异常

    在将控制权传递给调用方法(或其祖先之一)之前,如果无法确定异常导致操作失败,这非常有用,因为如果进程最终失败,我可以在stacktrace中追溯原因

  2. # 2 楼答案

    当你不知道如何自己处理异常,但你想记录异常被抛出的时候,你想重新抛出一个异常。重新调用它允许您捕获需要记录的堆栈信息,并将异常向上传递给调用方处理

  3. # 3 楼答案

    如果你能以某种方式证明你需要重新抛出你捕获的同一个异常,我认为你的设计有问题

    捕获一个异常并重新抛出另一个异常非常有意义。例如,您可能希望添加原始异常没有的详细信息

  4. # 4 楼答案

    我已经好几年没有使用Java了,但我记得它和其他语言一样,都有例外和OO。异常可以被子类化,通常,您希望捕获包含许多异常的基类,但可能无法处理所有异常。假设您正在处理远程文件传输,并且希望捕获所有IOERROR,因为您可以处理大多数IOERROR,但不能处理DiskFull。你可以重新播放,让其他人在播放链上进一步处理,但通过重新播放来处理其他问题,比如传输失败

  5. # 5 楼答案

    真实世界案例

    以下是我需要重新描述java异常的一些现实情况:

    • 在执行JDBC调用时,我会捕获一个SQLException。然而,postgres会抛出一个带有额外数据和状态的PSQLException。在测试边缘情况时,我们能够破坏数据库,我们希望记录器具有关于异常和状态的非常具体的数据。我们会将原始异常包装在一个新异常中,其中包含更多关于服务器状态的数据,并重新排序
    • 在实现文本解析器时,我希望捕获大量运行时解析异常,例如NumberFormatException,并将它们与有关文本导致的内容和导致解析异常的文本源的附加数据一起传递到堆栈中
    • 我的同事告诉我,他在一个项目中工作,每个异常都被包装在两种类型之一的另一个异常中——RetryableException和FatalException。在可重试的异常情况下,应用程序将等待一段固定时间后重试该操作<我不确定我对这个设计的感觉如何,但我可以把它看作是处理一些事务性问题的权宜之计
    • 在某些情况下,我会使用一个现有的API,该API为高级异常定义了一个抛出,我会执行一个操作,抛出一个不相关的异常(我觉得它确实属于RuntimeException)——然后我会重新抛出该异常,作为更一般的异常的原因
    • 我能想到的最纯粹的情况是,当你想向异常中添加额外数据时,你可能想要重新显示异常。例如:
      public bizMethod() throws CoolBizLogicException {
          int policyId = getPolicyId("bar");
          try {
            coolBizLogic(foobar); // this throws an exception
          }
          catch (CoolBizLogicException cble) {
            cble.setPolicyId(policyId);
            throw cble;
          }
      }
  6. # 6 楼答案

    当然。如果您需要对异常执行一些特殊处理(日志记录、清理等),但无法完全“处理”它,则通常会进行处理,然后重新显示异常。注意,在许多情况下(尤其是清理资源),您可能希望使用finally子句,而不是catch/rethrow