Python ';提高';内部';试试',何时以及如何使用';提高?

Python ';提高';内部';试试',何时以及如何使用';提高?,python,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] /

下面是代码:

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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
花式除法([0,2,4],0)
文件“/Users/dsn/.spyder-py3/temp.py”,第10行,花式分割
引发异常(“0”)
例外情况:0

为什么呢?什么是使用raise的正确方法/什么时候应该使用raise?

您的
最后
块本身会引发一个异常,一个被零除的错误(因为您的分母是0)。如果当异常冒泡时执行
finally
块,并引发其自身的异常,则它:

  • 在Python2上,替换现有的异常
  • 在Python3上,它将现有异常包装到新异常中(创建一个异常链,其中最外层的异常是被选中的异常,但内部异常存在于上下文中)
  • 您的其他代码打印回溯,因为您根本没有捕获您引发的第二个异常(并且它绕过了您的
    打印


    我建议多了解一些;您的示例代码是如此的做作/毫无意义,以至于无法说出您真正的误解是什么,也无法说明什么只是为了说明支持您的问题的特定行为。

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

    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
    
  • 在Python2上,替换现有的异常
  • 在Python3上,它将现有异常包装到新异常中(创建一个异常链,其中最外层的异常是被选中的异常,但内部异常存在于上下文中)
  • 您的其他代码打印回溯,因为您根本没有捕获您引发的第二个异常(并且它绕过了您的
    打印

    我建议多了解一些;你的示例代码是如此的做作/毫无意义,以至于你不可能说出你真正的误解是什么,也不可能仅仅说明支持你的问题的特定行为

    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
    之外的
    块,忽略其他块

    2.这将被触发,因为
    try
    块中存在异常

    块内使用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
    
    注意数字

    1.这个东西首先执行,触发第二个
    try
    之外的
    块,忽略其他块

    2.这将被触发,因为
    try
    块中存在异常

    块内使用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
    

    你的期末考试还有一个例外。您希望它做什么?最后运行
    块,引发
    ZeroDivisionError
    ,捕获并打印。你想干什么?也许还有更好的办法。你的最后一个例外。您希望它做什么?最后运行
    块,引发
    ZeroDivisionError
    ,捕获并打印。你想干什么?也许有更好的办法。