抛出错误

本文介绍Python中错误处理的基本概念,包括自定义错误类的定义及抛出、捕获和连续抛出错误的方法。通过实例展示了如何定义继承自内置错误类型的自定义错误,并在函数中抛出这些错误。

因为错误也是一个类,捕获一个错误就是捕获到该类的一个实例
因此,错误并不是凭空产生的,而是有意创建并抛出的
Python的内置函数会抛出很多类型的错误,自定义函数也可抛出错误

  自定义错误
  如果要抛出错误,首先根据需要,可以定义一个错误类,选择好继承关系,然后,用raise语句抛出一个错误的实例
  必要时可自定义错误类型,但尽量使用Python内置的错误类型

    class FooError(ValueError): #继承Python内置错误类型ValueError
        pass

    def foo(s):
        n = int(s)
        if n==0:
            raise FooError('invalid value: %s' % s)
        return 10 / n

    foo('0')
    
    #输出:
    Traceback (most recent call last):
    File "err_throw.py", line 11, in <module>
        foo('0')
    File "err_throw.py", line 8, in foo
        raise FooError('invalid value: %s' % s)
    __main__.FooError: invalid value: 0

  连续抛错误
  捕获错误目的只是记录一下,便于后续追踪,当前函数不知道应该怎么处理该错误时,就要继续往上抛,让顶层调用者去处理该错误
  若顶层调用者还无法知道如何处理时,就继续向上抛,直到错误得到正确解决,否则程序会中止

    def foo(s):
        n = int(s)
        if n==0:
            raise ValueError('invalid value: %s' % s)
        return 10 / n

    def bar():
        try:
            foo('0')
        except ValueError as e:
            print('ValueError!')
            raise    #在bar()函数中已经捕获了错误,但打印一个ValueError!后,又把错误通过raise语句抛出去了

    bar()

  关于raise

  raise语句如果不带参数,就会把当前错误原样抛出

    try:
        10 / 0
    except ZeroDivisionError:
        raise

  在except中raise一个Error,还可以把一种类型的错误转化成另一种类型
  只要是合理的转换逻辑就可以,但是,决不应该把一个IOError转换成毫不相干的ValueError

    try:
        10 / 0
    except ZeroDivisionError:
        raise ValueError('input error!')
在 Node.js 中,可以使用 `throw` 关键字配合 `Error` 对象来手动抛出错误。这种方式适用于同步代码中的错误处理。以下是具体实现方法: ### 同步代码中抛出错误 通过 `throw new Error('message')` 可以立即中断当前执行流程,并将控制权交给最近的异常处理器(如 `try...catch` 或全局未捕获异常处理器)。如果没有被捕获,则会终止进程。 ```javascript function checkCondition(value) { if (!value) { throw new Error('Invalid input provided'); // 手动抛出错误 } return value; } try { const result = checkCondition(false); } catch (error) { console.error(`Caught an error: ${error.message}`); // 捕获并打印错误信息 } ``` 此段代码展示了一个简单的条件验证函数,当输入不符合预期时,它会抛出带有描述性消息的错误实例[^1]。 ### 异步代码中抛出错误 对于基于 Promise 的异步操作,可以直接在 `async` 函数体内使用 `throw` 抛出错误,这相当于返回一个被拒绝(rejected)状态的 promise。 ```javascript const fetchData = async () => { const isValid = false; if (!isValid) { throw new Error('Data fetch failed due to invalid state.'); // 抛出错误 } }; fetchData().catch((err) => { console.error(`Fetch operation encountered an issue: ${err.message}`); }); ``` 这里演示了如何在异步上下文中利用 `throw` 和 `.catch()` 方法组合来进行错误管理[^1]。 此外,在实际开发过程中,为了增强可维护性和扩展性,通常建议创建自定义错误类型而非仅依赖通用的 `Error` 类型。这样可以根据业务需求定制不同的行为模式或附加字段用于日志记录等目的。 最后需要注意的是,在 Web 应用服务器端编程环境下(例如 Express),除了局部范围内的错误捕捉外,还应该配置好顶层的错误处理机制以防漏网之鱼损害整个应用的服务质量[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值