7.1.1 异常是什么
首先,“异常”这个高大上的词语所描述的现象实际上在前面章节的代码中已经多次出现了,只是没有详细解释这个概念,让我们一起回顾一下:
>>> 2 / 0 #除 0 错误
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
2 / 0
ZeroDivisionError: division by zero
>>>
>>> 'a' + 2 #操作数类型不支持
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
'a' + 2
TypeError: Can't convert 'int' object to str implicitly
>>>
>>> {3,4,5} * 3 #操作数类型不支持
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
{3,4,5} * 3
TypeError: unsupported operand type(s) for *: 'set' and 'int'
>>>
>>> fp = open(r'D: est.data','rb') #文件不存在
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
fp = open(r'D: est.data','rb') #文件不存在
FileNotFoundError: [Errno 2] No such file or directory: 'D:\test.data'
>>>
>>>
>>> print(test) #变量名不存在
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
print(test) #变量名不存在
NameError: name 'test' is not defined
>>>
>>>
>>> len(3) #参数类型不匹配
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
len(3) #参数类型不匹配
TypeError: object of type 'int' has no len()
>>>
通过前面章节的学习,大家应该已经注意到,如果类似于上面这些错误得不到正确的处理将会导致程序崩溃并终止运行。合理地使用异常处理结构可以使得程序更加健壮,具有更高的容错性,不会因为用户不小心的错误输入而造成程序终止,也可以使用异常处理结构为用户提供更加友好的提示。
异常处理是以为程序执行谷草恒中出现在正常控制流之外采取的行为。严格来说,语法错误和逻辑错误不属于异常,但有些语法错误往往会导致异常,例如,由于大小写拼写错误而试图访问不存在的对象,或者试图访问不存在的文件,等等。当Python监测到一个错误时,解释器就会指出当前程序已无法继续执行下去,这时候就出现了异常。当程序执行过程中出现错误时Python会自动引发异常,程序员也可以通过raise语句显式地引发异常。
注意:尽管异常处理机制非常重要也非常有效,但是不建议使用异常来代替常规的检查,例如必要的if...else判断等。在编程时应避免过多依赖于异常处理机制来提高程序的健壮性。
小常识:异常和错误这两个概念并不完全一样。异常一般是指运行时由于某些条件不符合而引发的错误,一旦引发异常并且没有得到有效的处理,一般是直接导致程序崩溃。错误一般又可以分为语法错误和逻辑错误两种。拼写错误、缩进不一致、引号或括号不闭合等都属于语法错误,一般来说存在语法错误的代码是无法运行的,这类错误很容易发现和解决;而存在逻辑错误的代码通常可以运行,只是非常可能会得到一个错误的结果,这类错误非常难发现。
常见疑问解答:为啥要使用异常处理结构呢?简单地说,可以理解为“请求原谅比请求允许要容易”。也就是说,有些代码执行可能会出现错误,也可能不会出现错误,这主要由运行时的各种客观因素决定,此时建议使用异常处理结构。如果使用大量的选择结构来提前判断,仅当满足相应条件时才执行该代码,这些条件可能会严重干扰正常的业务逻辑,也会降低代码的可读性。