语法错误
Python 解释器会输出出现语法错误的那一行,并显示一个箭头,指向行里检测到的第一个错误。
>>> while True print('Hello') File "", line 1 while True print('Hello') ^SyntaxError: invalid syntax
异常
即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
异常以不同的类型出现,这些类型都作为信息的一部分打印出来。错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。
异常处理
通常,异常不会被程序自动处理。Python 处理异常会用到 try-except 语句。
语法结构:
try: <语句块1> except <异常类型> : <语句块2>语句块2> 异常类型> 语句块1>
try 语句的工作原理如下:
- 首先,执行 try 子句的语句块。
- 如果没有异常发生,则跳过 except 子句。
- 如果发生了异常,则跳过 try 子句中剩余的语句部分。然后,如果异常类型和 except 关键字后面的异常类型匹配(同一个类或者是它的基类),则执行 except 子句的语句块,然后继续执行 try 语句之后的代码。
- 如果发生的异常和 except 子句中的异常不匹配,则将其传递到外部的 try 语句中;如果没有找到处理程序,则它是一个未处理异常,执行将停止并显示异常信息。
try … except 语句可以带有一个 else 子句,放在所有 except 子句之后。当 try 子句没有抛出异常时,需要执行一些代码,可以使用这个子句。有发生异常时不会执行 else 子句。
语句最后还可以加上一个 finally 子句,不管是否有异常发生,该子句都会被执行。当 try 语句中发生了未被 except 捕获的异常,在 finally 子句执行完成后,异常会被重新抛出。
抛出异常
Python 使用 raise 语句抛出一个指定的异常。
>>> raise NameError('Here')Traceback (most recent call last): File "", line 1, in NameError: Here
要抛出的异常由 raise 的唯一参数标识。它必须是一个异常的实例或者是异常的类(继承 Exception 类)。
如果你需要明确一个异常是否抛出,但不想处理它,raise 语句可以再次抛出该异常。
>>> try:... raise NameError('Here')... except NameError:... print('An exception flew by!')... raise...An exception flew by!Traceback (most recent call last): File "", line 2, in NameError: Here