1
def set_attribute(attributes, name, value):
    for i, attribute in enumerate(attributes):
        if name in attribute:
            quote_char = attribute.find('"')
            if quote_char == -1:
                raise ValueError
                return None
            attributes[i] = attribute[:quote_char+1] + str(value) + '"'
            return attributes

我是一名新程序员,我正在尝试正确理解异常处理。

在这个例子中,每个地方name也应该有一个"字符,所以如果失败,我想引发一个异常,但我也试图了解该return None语句是否必要(或做任何事情)。

我的理解是,在找到异常处理程序之前,我会逃离每个级别的范围。Python教程是这样说的:

  • 首先,执行 try 子句(try 和 except 关键字之间的语句)。
  • 如果没有发生异常,则跳过 except 子句并完成 try 语句的执行。
  • 如果在 try 子句执行期间发生异常,则跳过该子句的其余部分。然后如果它的类型与以 except 关键字命名的异常匹配,则执行 except 子句,然后在 try 语句之后继续执行。
  • 如果在 try 子句执行期间发生异常,则跳过该子句的其余部分。然后如果它的类型与以 except 关键字命名的异常匹配,则执行 except 子句,然后在 try 语句之后继续执行。
  • 如果发生与 except 子句中指定的异常不匹配的异常,则将其传递给外部 try 语句;如果没有找到处理程序,则它是一个未处理的异常,并且执行停止并显示如上所示的消息。

然而,在阅读了这个描述之后,我意识到我不理解异常,但我应该

所以简单地陈述这个问题:这个return None陈述是否必要,为什么?另外,我对异常的工作方式有什么误解?

4

1 回答 1

3

return None垃圾。Python 永远不会到达那里。


您可以简化代码并运行一个小实验来查看是否FOO返回了该值:

def foo():
    if True:
        raise ValueError('Bad value')
        return 'FOO'
    return 'BAR'

try:
    print(foo())
except ValueError as err:
    print(err)
    # Bad value

如果FOO被退回,您可能会在 中看到它print(foo()),但实际上该行没有打印任何内容。相反,您会看到Bad value.

于 2013-01-15T19:19:16.947 回答