异常的处理
一.什么是异常,
指的是与正常情况不同.在程序中程序的正常执行过程是按照代码顺序一行一行的执行,直到所有的代码都执行完成.
如果期间出现错误使代码不能正常运行完成就是异常,
当异常发生时解释器会打印异常的详细信息 并且终止程序的执行
如何排查错误
1.定位到错误发生的位置:
(1)如果自己写的代码,没有调用任何模块那就错误发生在最后一行,
(2)如果代码调用其他的模块
(1)系统内置模块 例如抛出object不用去查看object 他机会不可能出错
(2别人写的模块是有可能出错的 所以 你可以按照追踪信息点
击去看看绝招:如果有很多追踪信息 找最后一行是你自己写代码的位置
a = SyntaxError: invalid syntax 语法错误 age NameError: name 'age' is not defined 名字不存在 open("asasasas") FileNotFoundError: [Errno 2] No such file or directory: 'asasasas' 路径错误 f = open("1.今日内容") f.close() f.read() ValueError: I/O operation on closed file. 文件已经关闭 你还要去读写 f = open("1.今日内容",mode="rt",encoding="utf-8") f.write("123") io.UnsupportedOperation: not writable 不能写入数据 读写模式错误导致 int("abc") ValueError: invalid literal for int() with base 10: 'abc' 数据的值错误导致 def func(): print(1) print(2) IndentationError: unexpected indent 缩进错误 li = [] li[1] IndexError: list index out of range 索引不存在 dic = {} dic["name"] KeyError: 'name' key不存在
二.
异常可以由 发生的时间不同分为两类
1.语法检测异常
解释器在执行代码前会先检测语法 检测通过才会开始执行
如果这个阶段发生了异常 代码一行都不会执行
语法错误 和 缩进错误
这种低级错误 就别问了
2.运行时异常
已经通过了语法检测 在解析执行期间发生的异常
print("start") a = int("abc") print("over") li = [] 语法1 try: # 把可能发出错误的代码放到try中 print("start") # a = int("abc") li[1] print("over") except ValueError: # 当try中真的发生了错误 就会执行 except中的代码 # 在这里可以做一些补救措施 print("发生了 ValueError异常") print("over") # 语法2 except可以有多个 try: # 把可能发出错误的代码放到try中 print("start") a = int("abc") li[1] print("over") except ValueError: # 当try中真的发生了错误 就会执行 except中的代码 # 在这里可以做一些补救措施 print("发生了 ValueError异常") except IndexError: print("发生了 IndexError 索引不正确") print("over") 语法4 万能异常 Exception类 尽量少用 可能会导致 程序既不报错 也不正常运行 无法定位错误位置 try: # 把可能发出错误的代码放到try中 print("start") # a = int("abc") # li[1] 10 / 0 dic = {} dic["name"] print("over") except Exception: print("可能是任何类型的错误 反正是发生错误了") print("over") 语法5 万能异常 Exception类 建议 输出异常的值 try: # 把可能发出错误的代码放到try中 print("start") # a = int("abc") # li[1] 10 / 0 dic = {} dic["name"] print("over") # 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息 except Exception as e: print("可能是任何类型的错误 反正是发生错误了") print(e) print(type(e)) print("over") # 语法6 先捕获能够明确的异常类型 最后捕获万能异常类型 try: # 把可能发出错误的代码放到try中 print("start") # a = int("abc") # li[1] # 10 / 0 dic = {} dic["name"] print("over") except ValueError: print("值不对.....") except ZeroDivisionError: print("除数不能为0") # 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息 except Exception as e: print("可能是任何类型的错误 反正是发生错误了") print(e) print(type(e)) print("over") 语法7 try except else try: # 把可能发出错误的代码放到try中 print("start") # a = int("abc") # li[1] # 10 / 0 dic = {} # dic["name"] print("over") except ValueError: print("值不对.....") except ZeroDivisionError: print("除数不能为0") # 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息 except Exception as e: print("可能是任何类型的错误 反正是发生错误了") print(e) print(type(e)) else: #当没有发生异常会执行else 只能except的后面 print("执行了else") print("over") 语法8 try except finally try: # 把可能发出错误的代码放到try中 print("start") # a = int("abc") # li[1] # 10 / 0 dic = {} # dic["name"] print("over") except ValueError: print("值不对.....") finally: #无论是否发生异常 最后都会执行finally中的代码 print("finally") print("over") import io # finally的使用场景 可以用finally来执行一些清理操作 类似__del__ try: print("start") f = open("1.今日内容","rt",encoding="utf-8") f.read() print("end") except FileNotFoundError: print("文件路径错误...") except io.UnsupportedOperation: print("文件不能被写入....") finally: f.close() print(f.closed)
完整的书写顺序
try
except
else
finally
"""
# 你需要掌握的语法
"""
1.
try:
except:
2.
try:
except:
finally:
"""
# 正确使用异常处理
"""
1.如果能明确知道异常发生原因 就不要产生异常 使用if判断等方式
2.不知道异常发生的原因 但是知道异常的类型 那就明确捕获该类型的异常
3.不知道发生原因 也不知道 异常的类型 可以使用万能异常 但是一定要打印异常消息
"""