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时代这种语法就已经有效了。
