“raise”在“try”中,何时以及如何使用“raise”?

2024-04-25 17:51:51 发布

您现在位置:Python中文网/ 问答频道 /正文

代码如下:

def fancy_divide(list_of_numbers, index):
    try:
        try:
            raise Exception("0")
        finally:
            denom = list_of_numbers[index]
            for i in range(len(list_of_numbers)):
            l    ist_of_numbers[i] /= denom
    except Exception as ex:
        print(ex)

如果我打电话:

fancy_divide([0, 2, 4], 0)

为什么不打印“0”?你知道吗

如果我这样编辑代码:

def fancy_divide(list_of_numbers, index):
    try:
        try:
            raise Exception("0")
        finally:
            denom = list_of_numbers[index]
            for i in range(len(list_of_numbers)):
                list_of_numbers[i] /= denom
    except Exception as ex:
        raise Exception("0")
        print(ex)

然后调用同样的东西,它打印:

Traceback (most recent call last):

  File "<ipython-input-16-c1b0ac98281c>", line 1, in <module>
    fancy_divide([0, 2, 4], 0)

  File "/Users/dsn/.spyder-py3/temp.py", line 10, in fancy_divide
    raise Exception("0")

Exception: 0

为什么?什么是正确的方法/什么时候应该使用raise?你知道吗


Tags: of代码inindexdefexceptionlistex
2条回答

您的finally块本身引发了一个异常,一个被零除的错误(因为分母是0)。如果finally块在异常冒泡时执行,并引发自己的异常,则它可以:

  1. 在Python2上,替换现有的异常
  2. 在Python3上,它将现有的异常包装到新的异常中(创建一个异常链,其中最外层的异常是被选中的异常,而内部异常则存在于上下文中)

您的其他代码打印回溯,因为您根本没有捕获您引发的第二个异常(它绕过了print)。你知道吗

我建议reading the exception tutorial去理解更多;你的示例代码是如此的矫揉造作/毫无意义,以至于你不可能说出你真正的误解是什么,什么只是为了说明一个特定的行为来支持你的问题。你知道吗

def fancy_divide(list_of_numbers, index):
    try:
        try:
            raise Exception("0")  # 1
        finally:
            denom = list_of_numbers[index]
            for i in range(len(list_of_numbers)):
            list_of_numbers[i] /= denom
    except Exception as ex:
        print(ex)  # 2

注意数字

1.首先触发第二个try之外的except块,然后忽略其他块。你知道吗

2.当try块中出现异常时,将触发此操作。你知道吗

except块中使用raise来避免复杂的事情。你知道吗

我会把你的代码改写为:

def fancy_divide(list_of_numbers, index):
    try:
        # Your fancy divide logic here
    except Exception as ex:
        raise Exception('Something went wrong: {exception}'.format(exception=ex))
    finally:
        # Don't need to

相关问题 更多 >