在Python中存在着两种错误:语法错误、逻辑错误
语法错误在写程序的必不能犯的。因为只要写出了语法错误,整个程序就无法运行。这Python的规定
而逻辑错误,则是我们平常编写代码的过程中产生的,我们需要尽可能避免。
其中有些逻辑错误我们可以避免,如下:
inp = input('输入成绩:')
if inp.isdigit():
inp = int(inp)
else:
print('请输入数字!')
# 如果在inp输入完后就给它转换成int类型,如果输入的是字符串的话,那么必定会报错。
# 所以我们在其输入后,通过if判断是否为数字,再进行类型转换,就可以避免这个错误的产生
而有时逻辑错误的产生我们无法避免,也可以说无法预知它什么时候产生。举一个例子,如下:
# 举例!!!比如我们现在file_path里有很多文件路径,其中有些是json格式的文件,有些不是
import json
for i in file_path:
f = open(i,'r')
res = json.load(f)
# 我们将获取到的文件通过反序列化拿到json格式转Python格式的内容
# 那么此时就会有一个问题,有些文件它不是json格式啊,我们转换就会报错
以上例子就是说明了,我们知道运行过程中会产生错误,而我们却无法避免,因为只要经过转换不匹配就会报错。所以我们需要了解产生错误,如何来处理!
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
Python针对异常具有很好的提示,我们可以根据异常的类型以及信息,来对以及进行处理。
下面来了解一下Python中常见的异常:
异常类型 | 描述 |
---|---|
SyntaxError | Python语法错误 |
NameError | 未声明/初始化对象 (没有属性) |
AttributeError | 对象没有这个属性 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
IndexEroor | 索引错误(超出索引范围产生) |
KeyError | 没有这个键产生的错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
IOError | 输入/输出操作失败 |
AssertionError | 断言不成立 |
BaseException | 所有异常的基类 |
Exception | 常规错误的基类 |
Python中捕获异常需要用到两个关键字:try、except
其中try
内正常写入代码,如果其中代码产生错误后,错误将会被except
所捕捉到,从而进行处理。
语法:
try:
... # code
except:
... # 如果try里面的代码产生错误,则执行except里面的代码
else:
... # try运行完毕后,如果未产生错误,则运行这里面的代码
finally:
... # 不管是否产生错误都会执行这里面的代码
其中try
与except
或 try
与finally
可以配对使用,而else
根据需求使用
except
可以针对异常类型捕捉,而如果未指定捕获的异常类型,则默认产生所有异常都会捕获到
我们先尝试捕获指定异常类型
实例:
try:
res = open('1.txt')
except FileNotFoundError as f:
print('该文件不存在!',f)
执行结果
该文件不存在! [Errno 2] No such file or directory: '1.txt'
以上是在我们已知代码会产生这种异常类型的情况下才会捕获到,也可以针对多个异常类型进行捕获,语法格式:
try:
pass
except type1 as t:
pass
except type2 as t2:
pass
except (type3,type4) as t3: # 同时检测两个异常类型,如果出现其中一个,则执行
pass
# 而它们的执行顺序和if类似,如果产生错误,从上至下检测,匹配上了则执行对应里面的except代码
实例产生几个异常:
try:
print('1' + 1) # 产生类型错误,字符串不能和整型相加
except (TypeError,ValueError) as e:
print(e)
# 执行结果:can only concatenate str (not "int") to str
try:
int('s') # 传值的参数不能被int所转换
except (TypeError,ValueError) as e:
print(e)
# 执行结果:invalid literal for int() with base 10: 's'
打开文件,并在使用完毕后回收资源
try:
res = open('a.txt', mode='at', encoding='utf-8')
try:
print('正在向文件写入内容:123')
res.write('123\n')
finally: # 执行完try以后,不管是否产生错误,都会关闭文件
res.close()
print('已关闭文件')
except IOError: # 文件是否在打开或读取过程中产生错误
print('Error:没有找到文件或者读取文件失败')
执行结果
'正在向文件写入内容:123'
'已关闭文件'
在某一行加上assert 关键字
进行断言,用于判断断言语句是否成立,如果不成立,其下所有的代码都不会运行。
print('code....')
assert 1 > 2 # 断言不成立
# 以下代码都不会允许
print('Nnnnnn') # 该代码
执行结果
123
AssertionError # 断言不成立错误
断言可以用于进行代码调试,也可以在函数或其它局部内使用
这里抛出异常指的是我们手动抛出异常,可以是任意类型的异常,使用的关键字:raise 异常类型('异常信息')
,以这种格式
x = 5
if x < 10:
raise Exception(f"x小于10,x值为:{x}")
执行结果
Exception: x小于10,x值为:5
raise
抛出的异常类型必须继承Exception
这个类
手动抛出异常也会终止程序,当然:我们也可以通过try进行捕获
既是定义异常,那么我们就需要创建一个类,且继承BaseException
,目前经过笔者测试:继承了Exception
效果也是一至。那么我们下面定义的类就继承至Exception
class NotNumberError(Exception):
def __init__(self,data):
self.data = data
def __str__(self):
return self.data
x = 'sd'
if not x.isdigit():
raise NotNumberError('不是数字类型')
执行结果
__main__.NotNumberError: 不是数字类型
使用异常处理就是为了避免我们程序出现错误时,可以做出相对应的处理,最主要的就是为了处理那些不可控制的逻辑错误。当然并不是try
与except
写的越多越好,相反:如果特别多的话,说明该程序存在很多不可控的逻辑错误,从而降低程序代码的可读性。可控制的逻辑错误,可以不必使用。各位读者大大,See you next time~
技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请
点赞 收藏+关注
子夜期待您的关注,谢谢支持!