一.什么是异常
指的是 与正常情况不同
在程序中 程序的正常执行过程 按照代码顺序 一行一行很执行 知道所有代码都执行完
如果在执行过程中 出现了错误 导致代码无法执行完毕 就称之为异常
即 异常其实就是代码执行过程中出错了
常见的异常类型
当异常发生时 解释器 会打印异常详细信息 并且终止程序的执行
如何排查排查错误
1.定位到错误发生的位置
查看追踪信息
1.如果你的代码都是自己写的 没有调用任何内置模块或方法 那么错误发生位置一定在最后一行
2.如果你的代码调用其他模块的方法
1.是系统内置的模块 例如抛出位置object.py 不用去查看object类 它几乎不可能出错
一定是你自己代码在调用时出了错误
2.别人写的模块是有可能出错的 所以 你可以按照追踪信息点击去看看
绝招:如果有很多追踪信息 找最后一行是你自己写代码的位置
2.查看异常类型 例如:IndexError
3.查看异常的值 例如: list index out of range
如果没有任何异常信息 但是程序就是不对 可以使用
排除法
异常的三个组成部分
追踪信息
异常类型
异常的值
异常一旦发生就会导致程序终止 这对于用户而言体验极差 所以我们需要有一种机制
能够防止程序因为异常而终止
常见的错误
"""
# 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不存在
# a =
# print("hello")
View Code
二.异常可以由 发生的时间不同分为两类
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)
"""
View Code
"""
完整的书写顺序
try
except
else
finally
"""
# 你需要掌握的语法
"""
1.
try:
except:
2.
try:
except:
finally:
"""
# 正确使用异常处理
"""
1.如果能明确知道异常发生原因 就不要产生异常 使用if判断等方式
2.不知道异常发生的原因 但是知道异常的类型 那就明确捕获该类型的异常
3.不知道发生原因 也不知道 异常的类型 可以使用万能异常 但是一定要打印异常消息
"""