X Tutup
>凡事谦虚、温柔、忍耐,用爱心互相宽容,用平和彼此联络,竭力保守圣灵所赐合而为一的心。(EPHESIANS 4:2-3) #错误和异常(3) ###assert 从代码中理解`assert`。 >>> assert 1==1 >>> assert 1==0 Traceback (most recent call last): File "", line 1, in AssertionError 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." #Python 3: 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 a.deposit(-10) File "21801.py", line 10, in deposit assert amount > 0 AssertionError 这就是断言assert的引用。什么是使用断言的最佳时机?有文章做了总结: 如果没有特别的目的,断言应该用于如下情况: - 防御性的编程 - 运行时对程序逻辑的检测 - 合约性检查(比如前置条件,后置条件) - 程序中的常量 - 检查文档 (上述要点来自:[Python 使用断言的最佳时机](http://www.oschina.net/translate/when-to-use-assert) ) 不论是否理解,可以先看看,请牢记,在具体开发过程中,有时间就回来看看本教程,不断加深对这些概念的理解,这也是master的成就之法。 最后,引用维基百科中对“异常处理”词条的说明,作为对“错误和异常”部分的总结(有所删改): >异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。 >各种编程语言在处理异常方面具有非常显著的不同点(错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束)。某些编程语言有这样的函数:当输入存在非法数据时不能被安全地调用,或者返回值不能与异常进行有效的区别。例如,C语言中的atoi函数(ASCII串到整数的转换)在输入非法时可以返回0。在这种情况下编程者需要另外进行错误检测(可能通过某些辅助全局变量如C的errno),或进行输入检验(如通过正则表达式),或者共同使用这两种方法。 >通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃。 >从进程的视角,硬件中断相当于可恢复异常,虽然中断一般与程序流本身无关。 >从子程序编程者的视角,异常是很有用的一种机制,用于通知外界该子程序不能正常执行。如输入的数据无效(例如除数是0),或所需资源不可用(例如文件丢失)。如果系统没有异常机制,则编程者需要用返回值来标示发生了哪些错误。 >一段代码是异常安全的,如果这段代码运行时的失败不会产生有害后果,如内存泄露、存储数据混淆、或无效的输出。 >Python语言对异常处理机制是非常普遍深入的,所以想写出不含try, except的程序非常困难。 ------ [总目录](./index.md)   |   [上节:错误和异常(2)](./217.md)   |   [下节:编写模块](./219.md) 如果你认为有必要打赏我,请通过支付宝:**qiwsir@126.com**,不胜感激。
X Tutup