当前位置: 首页 > 文档资料 > 跟老齐学 Python >

错误和异常(3)

优质
小牛编辑
134浏览
2023-12-01

凡事谦虚、温柔、忍耐,用爱心互相宽容,用平和彼此联络,竭力保守圣灵所赐合而为一的心。(EPHESIANS 4:2-3)

错误和异常(3)

assert

从代码中理解assert

>>> assert 1==1>>> assert 1==0Traceback (most recent call last):  File "<stdin>", line 1, in <module>AssertionError

assert,翻译过来是“断言”之意。assert是一句等价于布尔真的判定,发生异常就意味着表达式为假。

assert的应用情景就有点像汉语的意思一样,当程序运行到某个节点的时候,就断定某个变量的值必然是什么,或者对象必然拥有某个属性等,简单说就是断定什么东西必然是什么,如果不是,就抛出异常。

#!/usr/bin/env python# coding=utf-8class 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.pyTraceback (most recent call last):  File "21801.py", line 22, in <module>    a.deposit(-10)  File "21801.py", line 10, in deposit    assert amount > 0AssertionError

这就是断言assert的引用。什么是使用断言的最佳时机?有文章做了总结:

如果没有特别的目的,断言应该用于如下情况:

  • 防御性的编程
  • 运行时对程序逻辑的检测
  • 合约性检查(比如前置条件,后置条件)
  • 程序中的常量
  • 检查文档

(上述要点来自:Python 使用断言的最佳时机 )

不论是否理解,可以先看看,请牢记,在具体开发过程中,有时间就回来看看本教程,不断加深对这些概念的理解,这也是master的成就之法。

最后,引用维基百科中对“异常处理”词条的说明,作为对“错误和异常”部分的总结(有所删改):

异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。

各种编程语言在处理异常方面具有非常显著的不同点(错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束)。某些编程语言有这样的函数:当输入存在非法数据时不能被安全地调用,或者返回值不能与异常进行有效的区别。例如,C语言中的atoi函数(ASCII串到整数的转换)在输入非法时可以返回0。在这种情况下编程者需要另外进行错误检测(可能通过某些辅助全局变量如C的errno),或进行输入检验(如通过正则表达式),或者共同使用这两种方法。

通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃。

从进程的视角,硬件中断相当于可恢复异常,虽然中断一般与程序流本身无关。

从子程序编程者的视角,异常是很有用的一种机制,用于通知外界该子程序不能正常执行。如输入的数据无效(例如除数是0),或所需资源不可用(例如文件丢失)。如果系统没有异常机制,则编程者需要用返回值来标示发生了哪些错误。

一段代码是异常安全的,如果这段代码运行时的失败不会产生有害后果,如内存泄露、存储数据混淆、或无效的输出。

Python语言对异常处理机制是非常普遍深入的,所以想写出不含try, except的程序非常困难。