异常链

有的时候我们会用printStackTrace来打印异常栈,有可能我们会在处理异常的时候同时又抛出一个异常。
自定义两个异常

class MyException1 extends Exception{
    
} 


class MyException2 extends Exception{
    MyException2(Throwable throwable){
        super(throwable);
    }
    MyException2(){
        super();
    }
}

接下来定义一个A 类,并在他的f()方法里调用g()方法,然后在f处理g里抛出的异常的时候再次抛出一个异常

class A{
    public void f() throws MyException2{
        try {
            g();
        } catch (MyException1 e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
                        //这里做了修改
            throw new MyException2(e);
        }
    }
    public void g() throws MyException1{
        throw new MyException1();
    }
}

接下来我们在main里跑一下

public class Main {
    public static void main(String[] args) {
        A a = new A();
        try {
            a.f();
        } catch (MyException2 e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
在 Python 中,**异常链(Exception Chaining)** 是指在一个异常处理过程中,又引发了另一个异常。Python 会自动记录原始异常和新引发的异常之间的关系,形成一个“链式结构”,帮助开发者追踪错误发生的完整路径。 ### 一、异常链的两种形式 1. **隐式异常链(Implicit chaining)** 当你在 `except` 块中抛出一个新的异常,默认情况下,Python 会将原始异常附加到新的异常上,并在错误信息中显示出来。 2. **显式异常链(Explicit chaining)** 使用 `raise ... from ...` 如果你希望明确地指出异常之间的因果关系,可以使用 `from` 关键字来指定原始异常。 --- ### 二、示例说明 #### 示例1:隐式异常链 ```python try: x = 1 / 0 except ZeroDivisionError as e: raise ValueError("不能除以零") ``` 输出: ``` Traceback (most recent call last): File "example.py", line 2, in <module> x = 1 / 0 ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "example.py", line 4, in <module> raise ValueError("不能除以零") ValueError: 不能除以零 ``` > 可以看到两个异常被链接在一起。 --- #### 示例2:显式异常链(使用 `from`) ```python try: x = 1 / 0 except ZeroDivisionError as e: raise ValueError("不能除以零") from e ``` 输出: ``` Traceback (most recent call last): File "example.py", line 2, in <module> x = 1 / 0 ZeroDivisionError: division by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File "example.py", line 4, in <module> raise ValueError("不能除以零") from e ValueError: 不能除以零 ``` > 使用 `from` 后,解释器会用更清晰的语言表明两个异常之间的因果关系。 --- ### 三、禁用异常链 如果你不希望保留原始异常的信息,可以使用 `raise ... from None` 来禁用异常链。 ```python try: x = 1 / 0 except ZeroDivisionError: raise ValueError("不能除以零") from None ``` 输出只包含当前异常信息: ``` Traceback (most recent call last): File "example.py", line 4, in <module> raise ValueError("不能除以零") from None ValueError: 不能除以零 ``` --- ### 四、应用场景 - **封装底层错误为高层抽象异常**:例如数据库操作失败时,将具体的 `IOError` 封装为自定义的 `DatabaseError`。 - **调试定位问题**:通过异常链可以追溯错误源头。 - **API 设计**:隐藏底层实现细节,提供统一的错误接口。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值