异常处理 一、简介 1 2 3 4 5 6 7 1. 异常处理是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况.2. 异常是程序执行过程中,发生了某种‘错误’,影响程序的正常运行. Python程序在执行前有可能会发生语法错误,也会导致程序无法正常执行。 - 运行时错误 - 语法错误3. 异常处理的目的:通过异常处理,我们可以对程序中出现的意外情况进行处理,防止程序崩溃,增加程序的健壮性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 在编程语言处理异常: 1. 使用if判断进行处理 a = 5 b = 0 if b != 0: print(a / b) else: print('除数不能为0') 2. 使用try块处理 a = 5 b = 0 try: print(a/b) except: print('除数不能为0') # if更适合用于一些可以预判的一种异常情况,但是if不可能把所有的异常情况都判断到,有些异常是我们无法预知
二、常见的异常 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 异常分类:(1)语法错误 (2)运行时错误 1. NameError: 名字异常 变量未定义,直接去使用 NameError: name 'a' is not defined 2. IndentationError: 缩进错误 在同一个代码块中,使用了不同的缩进 3. SyntaxError:语法错误 1a = 5 变量名不能以数字开头 4. TypeError: 类型错误 print(1+'1') 字符串和Int类型不能直接相加 5. ZeroDivisionError:除数为零错误 10/0 ZeroDivisionError: division by zero 6. FileNotFoundError: 文件未找到错误 读文件时,文件不存在 7. StopIteration:迭代器异常 next()调用次数超过了元素的个数 8. KeyError:键错误 访问字典不存在的键 d[key] 9. ValueError: 值错误 print(int('abc')) 将字符串强制转为int 10. AttributeError:属性错误 访问对象中不存在的属性或方法时 11. indexError:下标(越界)异常 下标超出范围 12. RecursionError:递归异常 递归超过最大深度 以上的异常类型都是由类定义的 13. Exception: 常见的错误异常的基类(父类)14. BaseException:所有异常的基类
三、处理异常 一般情况下,Python无法正确处理/执行程序时,就会发生(抛出)一个异常.
异常是一个对象,表示一个错误.
当Python程序发生异常时,我们就需要捕获并处理它,否则程序会终止执行(崩溃).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1. try-except try: 可能出现异常的代码 except: 所有的异常都会在这里处理(全捕获) try: 可能出现异常的代码 except 异常类型 as 变量名: 只有匹配异常类型时,才会执行except (精准匹配) # 注意:如果发生了异常,异常后面的代码不会被执行 try: 10/0 print('go on') # 这行代码不会被执行 except: xxx
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 try : 10 /0 except : print ('发生了错误' ) try : 10 /0 except IndexError as e: print ('发生了错误' )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2. try-except-except try: 可能出现异常的代码 except 异常类型1 as e: 该类型的异常处理 except 异常类型2 as e: 另一种类型的异常处理 except: xxx # 注意:通用性最高的要放最后面,匹配性最高的要放最前面 try: 10/0 # print([][1]) # print(int('abc')) except Exception as e: # 这里的except往后放 通用性强 print('发生下标越界错误',e) except ZeroDivisionError as e: print('发生了除数为零的错误',e) except: print('未知类型的异常')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 try : print ([][1 ]) except IndexError as e: print ('发生下标越界错误' ,e) except ZeroDivisionError as e: print ('发生了除数为零的错误' ,e) try : print (int ('abc' )) except IndexError as e: print ('发生下标越界错误' ,e) except ZeroDivisionError as e: print ('发生了除数为零的错误' ,e) except : print ('未知类型的异常' )
1 2 3 4 5 6 7 3. try-except-except-else try: 可能出现异常的代码 except Exception as e: print(e) else: print('如果没有发生异常则执行else')
示例:
1 2 3 4 5 6 7 8 9 10 11 12 import tracebacktry : a = int (input ('输入a:' )) b = int (input ('输入b:' )) print (a / b) except : print ('出错了' ) traceback.print_exc() else : print ('这是else' )
1 2 3 4 5 6 7 8 9 10 11 12 13 4. try-except-except-finally - 不论代码是否出现异常,都会执行finally import traceback try: a = int(input('输入a:')) b = int(input('输入b:')) print(a / b) except: traceback.print_exc() finally: print('最终~~~~')
四、自定义异常 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class MyException (BaseException ): def __init__ (self, msg ): self.__msg = msg def __str__ (self ): return self.__msg try : a = int (input ('输入a:' )) b = int (input ('输入b:' )) if b == 1 : raise MyException('除数不允许为1' ) else : print (a / b) except MyException as e: print (e)