Python 异常处理

目录

  • Python异常处理
    • 什么是异常?
      • 异常的三部分
    • 异常处理
      • 模拟上下文管理
    • 断言
    • 抛出异常
    • 自定义异常
    • 总结


Python异常处理

在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脚本发生异常时我们需要捕获处理它,否则程序会终止执行。


异常的三部分

  1. 异常出现的位置
  2. 异常的类型
  3. 异常的错误信息

Python 异常处理_第1张图片
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:
	... # 不管是否产生错误都会执行这里面的代码

其中tryexcepttryfinally可以配对使用,而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: 不是数字类型

总结

使用异常处理就是为了避免我们程序出现错误时,可以做出相对应的处理,最主要的就是为了处理那些不可控制的逻辑错误。当然并不是tryexcept写的越多越好,相反:如果特别多的话,说明该程序存在很多不可控的逻辑错误,从而降低程序代码的可读性。可控制的逻辑错误,可以不必使用。各位读者大大,See you next time~


技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请点赞 收藏+关注 子夜期待您的关注,谢谢支持!

你可能感兴趣的:(Python进阶,python,异常处理)