D.6 异常

Python 2.6和更新的2.x发行版有几个特性,可以使用这些特性在Python 3.x中移植异常处理程序并抛出异常。

D.6.1 处理异常(使用as)

Python 3中捕获和处理单个异常的语法如下所示。

except ValueError as e:

变量e包含异常的实例,它提供了错误抛出的原因。它是可选的,正如整个“as e”短语也是可选的一样。因此,这种变化只适用于那些保存这个值的用户。

等同的Python 2语法使用了一个逗号,而不是as关键字。

except ValueError, e:

这种变化发生在Python 3.x中,因为程序员试图用相同的程序处理超过一个异常时所导致的混乱。

为了用相同的程序捕获多个异常,初学者经常写这些代码。

except ValueError, TypeError, e:

事实上,如果你试图捕获多个异常,你需要使用一个包含所有异常的元组。

except (ValueError, TypeError), e:

Python 3.x(和Python 2.6+)中的as关键字,意在确保原始语法中的逗号不再成为混乱的根源。然而,当你试图用相同的处理程序捕获多种类型的异常时,仍然需要圆括号。

except (ValueError, TypeError) as e:

为了移植工作,当定义保存实例的异常处理程序时,Python 2.6 和更新版本都接受逗号或as关键字。相比之下,Python 3中只允许as语句。可以在PEP 3110中找到有关这个改变的更多信息。

D.6.2 抛出异常

其实,Python 3.x中有关抛出异常的变化并不是一个变化。实际上,它甚至与Python 2.6的过渡工作没有任何关系。Python 3中抛出异常(为异常提供可选原因)的语法如下。

raise ValueError('Invalid value')

Python长期用户可能一直使用下面的语法(虽然所有2.x版本都支持这两种方法)。

raise ValueError, 'Invalid value'

需要强调的是,抛出异常相当于实例化一个异常类,并提供一些额外的灵活性,而Python 3仅仅支持第一种写法。好消息是,你不必等待到2.6版本来开始使用这种技术,正如附录C提到的,自从Python 1.x时代这种语法就已经有效了。