10.11 到底为什么要异常

如果上文的动机不够充分,试想Python编程没有程序级的异常处理。第一件事需要担心的是客户端程序员在自己的代码中遗忘控制。举例来说,如果你创造了一个交互的应用程序分配并使用了大量的资源,如果一个用户击中Ctrl+C或其他键盘中断,应用程序将不会有机会执行清理工作,可能导致数据丢失或数据损坏。此外,也没有机制来给出可选的行为,诸如提示用户,以确认他们真的是想退出或是他们意外的按下了Ctrl键。

另一个缺点就是函数必须重写来为错误的情形返回一个“特殊”的值,如:None。程序员要负责检查每一个函数调用的返回值。这可能是个麻烦,因为你可能不得不检查返回值,这和没有发生错误时你期待结果也许不是同一类型的对象。什么,你的函数要把None作为一个有效的数值返回?那么,你将不得不拿出另一个返回值,也许是负数。我们也许并不需要提醒你,在Python的环境下负数下可能是有效的,比如作为一个序列的索引。作为一个写应用程序接口(API)的程序员,你不得不为每个一个用户输入可能遇到的返回错误写文档。同时,我们难以(而且乏味)在多层次的代码中以传播错误(和原因)。

没有一个简单的传播方法像异常一样做到这一点。因为错误的数据需要在调用层次中向上转发,但在前进的道路上可能被曲解。一个不相干的错误可能会被宣布为起因,而实际上它与原始问题完全无关。在一层一层的传递中,我们失去了对原始错误封装和保管的能力,更不用说完全地失去我们原本关心的数据的踪影!异常不仅简化代码,而且简化整个错误管理体系——它不该在应用开发中如此重要角色;而有了Python的异常处理能力,也的确没有必要了。