Python的异常处理以及正确捕获
首先,我们需要搞明白一件事,程序是人编写的,既然是人所编写,自然有概率出现问题,出现问题的原因多种多样,有可能环境不正确,变量引用时不符合程序的规定类型,文件读取是编码未正确设置从而无法正常读取等等各种各样的问题,而在python,当然,也包括其他的各类的编程语言,例如C语言,Java语言,其设定都是逐行执行所编写的代码,如果有错误,那么程序会异常的退出,从而保护数据的正确性,保护程序的逻辑性连贯正确。但是,很多情况下,异常不是我们所能控制的,例如,源代码在不同的平台运行,环境的差异等各种原因,有些异常是不一定出现,或者必定出现而无法避免的。
通常的,在高级的编程语言中,基本都内置了默认异常处理器。
如果我们没有对异常进行任何预防,那么程序在执行过程中发生异常就会中断程序,调用python默认的异常处理器,并在终端输出异常信息。例如:
a=2/0 print(a) print('hello ,hahaha') #运行结果: Traceback (most recent call last): File "C:/Users/Administrator/.PyCharmCE2019.3/config/scratches/文件名", line 104, in <module> a=2/0 ZeroDivisionError: division by zero #这个是默认的Python异常处理器 #遇到异常,会中断程序的执行,并抛出该异常的类型 #因此,print('hello ,hahaha')这段代码不会执行
在Python程序执行过程中发生的异常可以通过try语句来检测,可以把需要检测的语句放置在try块里面,try块里面的语句发生的异常都会被try语句检测到,并抛出异常给Python解释器,Python解释器会寻找能处理这一异常的代码,并把当前异常交给其处理。这一过程称为捕获异常。如果Python解释器找不到处理该异常的代码,Python解释器会终止该程序的执行。而中断程序不是我们所希望的,我们希望程序可以正常的执行,这样做是有意义的,因为,你可以将程序想象成一条条路径,尽管路径有问题,但不是毁灭性的问题,我们仍然希望达到终点,毕竟,不是所有的程序只有一个功能,这个功能不能实现,但别的功能可以实现,这个也就是我们通常所说的健壮性。因此,Python引入了try 语句,以此来为错误做个提示,并保证程序的健壮性。
try语句有两种形式:一种是try—except;一种是try—finally。也可以是try—except—finally的组合。一个try语句可以对应一个或多个except语句,但只能对应一个finally子句。finally子句的作用是不管异常有没有发生,该语句块的代码都会被执行。这样就可以把一些不管异常有没有发生,都必须要执行的代码放置到finally子句块中。
下面。代码演示:
try: with open('d:\\1.png','a+') as file: file.read() print(2/0) except ZeroDivisionError as e: #使用标准异常类库内的ZeroDivisionError print(e) #打印所捕获的异常 finally: print('程序安好!!我还可以继续,哈哈') #上面的代码添加了try—except语句,用于对异常进行处理。把需要检测发生异常的语句放置在try子句块中,把需要处理异常的语句放置在except子句块中。except后面的ZeroDivisionError是Python提供的标准异常名称,当整数除以时,该异常被抛出。Python提供了几十个标准异常名称,用于处理在不同情况下发生的异常。 =============================================================== try: with open('d:\\1.png','a+') as file: file.read() print(2/0) a = 2 / 0 print(a) except BaseException as e: #使用基类捕获异常 print(e) #打印所捕获的异常 finally: print('程序安好!!我还可以继续,哈哈') #当不清楚异常需要使用哪个标准异常名称时,可以直接使用BaseException异常名称或Exception异常名称,#BaseException异常是所有异常的基类,Exception异常是常规错误的基类。 #当然,在此例中,如果文件不存在,会有两个异常,但只会捕获第一个异常,文件未找到的异常 #如果文件存在,会有两个异常,也只会捕捉第一个异常,那就是ZeroDivisionError异常 #异常捕获成功后,程序必定会执行下去。 #但,由于有finally()语句,该语句会必定执行。
比较常见的异常有角标异常,文件读取异常,文件关闭异常,zero异常。通常使用baseexception和exception,因为基类捕获异常一般不会失败。下面附标准异常类表
、标准异常表
异常名称 | 描述 |
---|---|
Exception | 所有异常的基类 |
StopIteration | 当一个迭代器的 next()方法不指向任何对象时引发 |
SystemExit | 由 sys.exit()函数引发 |
StandardError | 除了StopIteration异常和SystemExit,所有内置异常的基类 |
ArithmeticError | 数值计算所发生的所有错误的基类 |
OverflowError | 当数字类型计算超过最高限额引发 |
FloatingPointError | 当一个浮点运算失败时触发 |
ZeroDivisonError | 当除运算或模零在所有数值类型运算时引发 |
AssertionError | 断言语句失败的情况下引发 |
AttributeError | 属性引用或赋值失败的情况下引发 |
EOFError | 当从 input() 函数输入,到达文件末尾时触发 |
ImportError | 当一个 import 语句失败时触发 |
KeyboardInterrupt | 当用户中断程序执行,通常是通过按 Ctrl+c 引发 |
LookupError | 所有查找错误基类 |
IndexError KeyError | 当在一个序列中没有找到一个索引时引发 当指定的键没有在字典中找到引发 |
NameError | 当在局部或全局命名空间中找不到的标识引发 |
UnboundLocalError EnvironmentError | 试图访问在函数或方法的局部变量时引发,但没有值分配给它。 Python环境之外发生的所有异常的基类。 |
IOError IOError | 当一个输入/输出操作失败,如打印语句或 open()函数试图打开不存在的文件时引发 操作系统相关的错误时引发 |
SyntaxError IndentationError | 当在Python语法错误引发; |
SystemError | 当解释器发现一个内部问题,但遇到此错误时,Python解释器不退出引发 |
SystemExit | 当Python解释器不使用sys.exit()函数引发。如果代码没有被处理,解释器会退出。 |
当操作或函数在指定数据类型无效时引发 | |
ValueError | 在内置函数对于数据类型,参数的有效类型时引发,但是参数指定了无效值 |
RuntimeError | 当生成的错误不属于任何类别时引发 |
NotImplementedError | 当要在继承的类来实现,抽象方法实际上没有实现时引发此异常 |