回顾
在Python进阶记录之基础篇(二十)中,我们介绍了Python面向对象中的类方法和静态方法,以及类中拥有特殊功能的魔法函数。需要重点掌握类方法和静态方法的概念和基本用法,理解魔法函数的作用冰女熟练使用常用魔法函数来定制类。今天我们讲一下Python中的语法错误和异常以及对异常的处理。
语法错误
在我们刚开始学习Python时,由于不够熟悉,经常会出现一些语法错误。
语法错误
Python中的语法错误也被称为解析错误,是初学者很容易碰到的错误。好消息是运行后Python语法分析器能准确指出出错的那一行,并且在最先找到的错误的位置标记上一个小小的箭头,从而让我们快速定位语法错误。
上述代码中,我们的if条件语句后少了个冒号,运行后看到报错,我们就能意识到错误所在,从而修正这个语法错误。
异常
有时候,虽然我们的Python程序没有语法错误,但在运行它的时候,我们会发现程序也有可能报错。这种情况下,通常是程序发生了异常。
程序异常
上述代码中,从语法角度讲,程序是没有问题的。但是可以看到,运行还是报错了,原因是我们把0当做了除数,使Python抛出了一个ZeroDivisionError的异常错误。像这种运行时被检测到的错误就叫做异常。
我们再来看另外一个例子,我们知道,Python中是不允许字符串类型和数字类型进行运算的,现在我们试图使用字符串2和整数2相加。
程序异常
如我们所料,Python再次抛出异常,并且异常错误为TypeError。事实上,与大多数编程语言类似,Python也有各种不同类型的异常,例如我们例子中的ZeroDivisionError和TypeError就是常见的两种异常,并且大多数的异常都不会直接被程序处理,而是以错误信息的形式展现在运行结果中,同时会终止程序的运行。
异常处理
与语法错误不同的是,我们可以捕捉异常。当程序发生异常的时候,我们捕捉到异常让程序暂停当前执行的代码并跳转至错误处理代码,处理结束再继续程序的运行,从而规避程序因发生异常而导致终止。
Python中通过“try...except...finally...”语句块来处理异常,基本格式如下:
try:
可能发生异常的代码
except:
处理异常的代码
finally(可省略):
无论异常是否发生都会执行的代码
现在,我们通过捕捉异常来处理之前发生异常的两个程序。
异常的简单处理
上述代码中,我们分别通过捕捉ZeroDivisionError和TypeError这两个异常顺利修复了之前报错的两个程序。
下面我们总结一下“try...except...finally...”语句块的执行方式:
1、执行try中的子句。
2、如果没有异常发生,则跳过except子句,直接执行后续代码。
3、如果在执行try子句的过程中发生了异常,那么try子句中发生异常代码的那行开始余下的代码将不再执行。如果异常的类型和except的异常名称相符,那么对应的except子句将被执行,执行完后再执行后续代码。
4、如果异常没有与任何的except匹配,那么这个异常就会被抛出,程序终止。
一个try语句可能包含多个except子句,分别来处理不同类型的异常,但最多只有一个分支会被执行。
一个try多个except子句
上述代码中,我们同时捕捉了ZeroDivisionError和TypeError这两个异常,这样,程序就可以同时处理0为除数或类型错误时的情况了。
对于多异常处理,你也可以写成元组的形式。
except (ZeroDivisionError, TypeError):
pass
但是这种写法如果要处理不同的异常,你需要在except子句中先判断异常类型再做相应处理。
在执行程序的过程中,我们有时也会碰到一些意想不到的异常,或者不知道异常名称,因此,我们通常会将try语句的最后一个except子句忽略异常的名称,将它作为通配符使用。
except异常通配符
除此之外,“try...except...finally...”语句块还有一个可选的else子句,与finally子句不同的是,这个子句只会在try子句没有发生任何异常的时候执行。
else子句
上述代码中,第一段“try...except...finally...”语句块发生异常,不会走else子句,而第二段“try...except...finally...”语句块没有发生异常,因此会走else子句。
总结
以上内容介绍了Python中的语法错误和异常以及对异常的处理方法,需要重点掌握语法错误和异常的基本概念,熟练使用“try...except...finally...”语句块处理异常。