MST

星途 面试题库

面试题:Java异常链在多层嵌套调用中的传播处理

假设存在一个Java方法A调用方法B,方法B调用方法C,方法C可能抛出特定异常,在方法A中捕获该异常并构建异常链传递给上层调用者,描述这个过程中如何确保异常信息的完整性以及如何合理处理不同层次的异常包装,并用代码实现。
28.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java中,当方法A调用方法B,方法B调用方法C,且方法C可能抛出特定异常时,我们可以通过以下步骤确保异常信息的完整性并合理处理不同层次的异常包装:

  1. 捕获异常:在方法A中捕获方法C抛出的异常。
  2. 构建异常链:使用带Throwable参数的构造函数将原始异常包装到新的异常中,从而构建异常链。
  3. 传递异常:将包装后的异常抛给上层调用者。

以下是代码示例:

class CustomException extends Exception {
    public CustomException(String message, Throwable cause) {
        super(message, cause);
    }
}

class MethodC {
    public static void methodC() throws Exception {
        // 模拟可能抛出异常的操作
        throw new Exception("这是方法C抛出的异常");
    }
}

class MethodB {
    public static void methodB() throws Exception {
        try {
            MethodC.methodC();
        } catch (Exception e) {
            // 包装异常
            throw new Exception("方法B捕获并包装了方法C的异常", e);
        }
    }
}

class MethodA {
    public static void methodA() throws CustomException {
        try {
            MethodB.methodB();
        } catch (Exception e) {
            // 捕获并构建异常链
            throw new CustomException("方法A捕获并包装了方法B的异常", e);
        }
    }
}

public class ExceptionChainingExample {
    public static void main(String[] args) {
        try {
            MethodA.methodA();
        } catch (CustomException e) {
            // 打印异常信息,包含完整的异常链
            e.printStackTrace();
        }
    }
}

在上述代码中:

  • MethodC抛出一个普通的Exception
  • MethodB捕获MethodC的异常,并将其包装在一个新的Exception中,构建了初步的异常链。
  • MethodA捕获MethodB抛出的异常,并将其包装在自定义的CustomException中,进一步完善异常链。
  • main方法中,捕获MethodA抛出的CustomException并打印堆栈跟踪信息,确保异常信息的完整性。