异常概述
在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为”异常”。这些异常有的是由于开发者一时疏忽将关键字敲错导致的,这类错误多数产生的是 SyntaxError: invalid syntax (无效的语法),这将直接导致程序不能运行。这类异常是显式的,在开发阶段很容易发现。还有一类是隐式的,通常和使用者的操作有关。
除了 ZeroDivisionError 异常外, Python 中还有很多异常。如表 1 所示为 Python 中常见的异常。
| 异常 | 描述 |
|---|---|
| NameError | 尝试访问一个没有声明的变量引发的错误 |
| IndexError | 索引超出序列范围引发的错误 |
| IndentationError | 缩进错误 |
| ValueError | 传入的值错误 |
| KeyError | 请求一个不存在的字典关键字引发的错误 |
| IOError | 输入/输出错误(如要读取的文件不存在) |
| ImportError | 当 import 语句无法找到模块或 from 无法在模块中找到相应的名称时引发的错误 |
| AttributeError | 尝试访问未知的对象属性引发的错误 |
| TypeError | 类型不合适引发的错误 |
| MemoryError | 内存不足引发的错误 |
| ZeroDivisionError | 除数为 0 引发的错误 |
说明:表 1 所示的异常并不需要记住,只要简单了解即可。
异常处理语句
在程序开发时,有些错误并不是每次运行都会出现。只要输入的数据符合程序的要求,程序就可以正常运行,否则将抛出异常并停止运行。
这时,就需要在开发程序时对可以出现异常的情况进行处理。下面将详细介绍 Python 中提供的异常处理语。
try…except 语句
在 Python 中,提供了 try...except 语句捕获并处理异常。在使用时,把可能产生异常的代码放在 try 语句块中,把处理结果放在 except 语句块中,这样,当 try 语句块中的代码出现错误时,就会执行 except 语句块中的代码,如果 try语句块中的代码没有错误,那么 except 语句块将不会执行。具体的语法格式如下:
try:
block1
except [ExceptionName [as alias]]:
block2参数说明如下:
- block1:表示可能出现错误的代码块。
- ExceptionName [as alias]:可选参数,用于指定要捕获的异常。其中, ExceptionName 表示要捕获的异常名称,如果在其右侧加上 as alias 则表示为当前的异常指定一个别名,通过该别名,可以记录异常的具体内容。
说明:在使用
try...except语句捕获异常时,如果在except后面不指定异常名称,则表示捕获全部异常。
- block2:表示进行异常处理的代码块。在这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容。
说明:使用
try...except语句捕获异常后,当程序出错时,输出错误信息后,程序会继续执行。
try…except…else 语句
在 Python 中,还有另一种异常处理结构,它是 try…except…else 语句,也就是在原来 try…except 语句的基础上再添加一个 else 子句,用于指定当 try 语句块中没有发现异常时要执行的语句块。当 try 语句中发现异常时,该语句块中的内容将不被执行。
try…except…finally 语句
完整的异常处理语句应该包含 finally 代码块,在通常情况下,无论程序中有无异常产生 finally 代码块中的代码都会被执行。其基本格式如下:
try:
block1
except [ExceptionName [as alias]]:
block2
finally:
block3对于 try…except…finally 语句的理解并不复杂,它只是比 try...except 语句多了一个 finally 语句,如果程序中有一些在任何情形中都必须执行的代码,那么就可以将它们放在 finally 语句的代码块中。
说明:使用
except子句是为了允许处理异常。无论是否引发了异常,使用finally子句都可以执行清理代码。如果分配了有限的资源(如打开文件),则应将释放这些资源的代码放置在finally代码块中。
使用 raise 语句抛出异常
如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用 raise 语句在函数或方法中抛出异常。raise 语句的基本格式如下:
raise [ExceptionName[(reason)]]其中, ExceptionName[(reason)] 为可选参数,用于指定抛出的异常名称,以及异常信息的相关描述。如果省略,就会把当前的错误原样抛出。
说明:ExceptionName(reason) 参数中的 (reason) 也可以省略,如果省略,则在抛出异常时不附带任何描述信息。
使用 assert 语句调试程序
在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。对于语法方面的错误比较好检测,因为程序会直接停止,并且给出错误提示。而对于逻辑错误就不太容易发现了,因为程序可能会一直执行下去,但结果是错误的,所以掌握一定的程序调试方法,可以说是一项必备技能。
Python 提供了 assert 语句来调试程序。 assert 的中文意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。 assert 语句的基本语法如下:
assert expression [,reason]参数说明如下:
- expression:条件表达式,如果该表达式的值为真,什么都不做;如果为假,则抛出 AssertionError 异常。
- reason:可选参数,用于对判断条件进行描述,为了以后更好地知道哪里出现了问题。
在通常情况下, assert 语句可以和异常处理语句结合使用。assert 语句只在调试阶段有效。我们可以通过在执行 python 命令时加入﹣O (大写字母)参数来关闭 assert 语句。
