错误和异常(3)
按照一般的学习思路,掌握了前两节内容,已经足够编程所需了。但是,我还想再多一步,还是因为本教程的读者是要from beginner to master。
assert
>>> assert 1==1
>>> assert 1==0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
从上面的举例中可以基本了解了assert的特点。
assert,翻译过来是“断言”之意。assert是一句等价于布尔真的判定,发生异常就意味着表达式为假。
assert的应用情景就有点像汉语的意思一样,当程序运行到某个节点的时候,就断定某个变量的值必然是什么,或者对象必然拥有某个属性等,简单说就是断定什么东西必然是什么,如果不是,就抛出错误。
#!/usr/bin/env python
# coding=utf-8
class Account(object):
def __init__(self, number):
self.number = number
self.balance = 0
def deposit(self, amount):
assert amount > 0
self.balance += balance
def withdraw(self, amount):
assert amount > 0
if amount <= self.balance:
self.balance -= amount
else:
print "balance is not enough."
上面的程序中,deposit()和withdraw()方法的参数amount值必须是大于零的,这里就用断言,如果不满足条件就会报错。比如这样来运行:
if __name__ == "__main__":
a = Account(1000)
a.deposit(-10)
出现的结果是:
$ python 21801.py
Traceback (most recent call last):
File "21801.py", line 22, in <module>
a.deposit(-10)
File "21801.py", line 10, in deposit
assert amount > 0
AssertionError
这就是断言assert的引用。什么是使用断言的最佳时机?有文章做了总结:
如果没有特别的目的,断言应该用于如下情况:
- 防御性的编程
- 运行时对程序逻辑的检测
- 合约性检查(比如前置条件,后置条件)
- 程序中的常量
- 检查文档
(上述要点来自:Python 使用断言的最佳时机 )
不论是否理解,可以先看看,请牢记,在具体开发过程中,有时间就回来看看本教程,不断加深对这些概念的理解,这也是master的成就之法。
最后,引用危机百科中对“异常处理”词条的说明,作为对“错误和异常”部分的总结(有所删改):
异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。
各种编程语言在处理异常方面具有非常显著的不同点(错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束)。某些编程语言有这样的函数:当输入存在非法数据时不能被安全地调用,或者返回值不能与异常进行有效的区别。例如,C语言中的atoi函数(ASCII串到整数的转换)在输入非法时可以返回0。在这种情况下编程者需要另外进行错误检测(可能通过某些辅助全局变量如C的errno),或进行输入检验(如通过正则表达式),或者共同使用这两种方法。
通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃。
从进程的视角,硬件中断相当于可恢复异常,虽然中断一般与程序流本身无关。
从子程序编程者的视角,异常是很有用的一种机制,用于通知外界该子程序不能正常执行。如输入的数据无效(例如除数是0),或所需资源不可用(例如文件丢失)。如果系统没有异常机制,则编程者需要用返回值来标示发生了哪些错误。
一段代码是异常安全的,如果这段代码运行时的失败不会产生有害后果,如内存泄露、存储数据混淆、或无效的输出。
Python语言对异常处理机制是非常普遍深入的,所以想写出不含try, except的程序非常困难。