Discuss / Python / 关于抛出错误的一个问题

关于抛出错误的一个问题

Topic source

在这节的结尾提到了先捕获错误,再抛出错误,让顶层调用者去处理,其实这里我觉得跟记录错误没什么不同,都是先捕获一个错误然后记录,然后再让Python解释器来打印出错误堆栈。注意,这跟直接让python解释器打印错误堆栈不同,使用logging方法可以让程序继续运行下去


import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:
        logging.exception(e)

main()
print('我可以运行吗')

main()
print('END')

main()
ERROR:root:division by zero
Traceback (most recent call last):
  File "D:\tryy.py", line 11, in main
    bar('0')
  File "D:\tryy.py", line 7, in bar
    return foo(s) * 2
  File "D:\tryy.py", line 4, in foo
    return 10 / int(s)
ZeroDivisionError: division by zero
我可以运行吗

可以看到程序出错之后继续打印出了'END'.但是结尾处提到的捕获错误再抛出错误并不能让程序继续执行下去

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()
print('我可以运行吗?')

bar()
ValueError!
Traceback (most recent call last):
  File "D:\mpy.py", line 14, in <module>
    bar()
  File "D:\mpy.py", line 9, in bar
    foo('0')
  File "D:\mpy.py", line 4, in foo
    raise ValueError('invalid value: %s' % s)
ValueError: invalid value: 0

显然,通过这种方法并不能让程序继续运行,而logging方法正是弥补了这一点,先记录错误,再打印错误堆栈,然后程序还能运行下去!那么问题来了,直接用logging不就好了吗?最后一种抛出错误的方法意义在哪里呢?小白一枚,望大神解答!

我跟你一样有这个疑问

但是抛出错误的话好像程序不会继续往下运行。和logging不一样吧。

有些错误出错了,对程序没什么影响,继续执行就执行吧。

但是也有一些错误,一旦出错就应该让程序停掉。 第二种,将错误继续往上抛就是为了让调用者必须处理这个错误。

比如: 程序先获取一个 key ,然后用 key 去重复获取一些数据; 不知道什么原因,key 为空了,如果程序继续执行,那显然是在 空跑。因为把异常捕获了之后还让它继续执行了,所以这种情况,就必须让使用者去处理这个异常。(当发现这个异常,可以再重新获取一遍key)


  • 1

Reply