Python 异常处理笔记

什么是异常?

异常简单理解,就是非正常,没有达到预期目标。
异常是一个事件,并且这个异常事件在我们程序员的运行过程中出现,会影响我们程序正常执行。

异常分两种:

1. 语法错误导致的异常
2. 逻辑错误导致的异常

如何处理异常?

  1. 如果错误发生的情况是可以预知的,那么就可以使用流程控制进行预防处理
#比如: 两个数字的运算,其中一个不是数字,运算就会出错。这时可以去判断来预防
n2 = 3
if isinstance(n2,int):
    res = 10+n2
    print(res)
  1. 如果错误的发生条件不可预知,就可以使用 try。。。except。。 在错误发生时进行处理
'''语法:
try:
    可能发生异常错误的代码
except:
    如果发生异常则进入 except 代码块进行处理
'''

# 假设读取的文件不存在,会发生错误,可以使用两种方式进行处理,
# 1。可以在文件读取前先判断当前的文件是否存在
# 2。也可以使用try 。。。 except。。在错误发生时进行处理
try:
    with open('./user.txt','r') as fp:
        res = fp.read()
    print(res)
except:
    print('文件不存在')

print('程序的继续执行。。。')

注意:try。。except。。是在错误发生后进行的处理。和if有着根本性的区别。

Try。。。except。。详细用法

# try。。except 详细用法


# 1。使用try。。except 处理指定的异常。如果引发了非指定的异常,则无法处理
try:
    s1 = 'hello'
    int(s1) # 会引发 ValueError
except ValueError as e:
# except IndexError as e:  #如果引发了非指定的异常,则无法处理
    print(e)


# 2。 多分支处理异常类.不同的异常会走向不同的except处理
s1 = 'hello'
try:
    # int(s1) # ValueError
    s1[5]    # IndexError
except IndexError as e:
    print('IndexError',e)
except KeyError as e:
    print('KeyError',e)
except ValueError as e:
    print('ValueError',e)


# 3。通用异常类 Exception
s1 = 'world'
try:
    int(s1)
except Exception as e:
    print('Exception ===',e)


# 4. 多分支异常类+通用异常类.这样引发异常后会按照从上往下的顺序去执行对应的异常处理类。
s1 = 'hello'
try:
    # int(s1) # ValueError
    s1[5]    # IndexError
except IndexError as e:
    print('IndexError',e)
except KeyError as e:
    print('KeyError',e)
except ValueError as e:
    print('ValueError',e)
except Exception as e:
    print('Exception',e)


# 5。 try...except...else...
s1 = 'hello'
try:
    str(s1)
except IndexError as e:
    print('IndexError',e)
except ValueError as e:
    print('ValueError',e)
except Exception as e:
    print('Exception',e)
else:
    print('try代码块中没有引发异常时,执行')

# 6。try...except..else..finally
# finally 无论是否引发异常,都会执行。通常情况下用于执行一些清理工作。
s1 = 'hello'
try:
    int(s1)
    print('如果前面的代码引发了异常,这个代码块将不在继续执行。。')
except IndexError as e:
    print('IndexError',e)
except ValueError as e:
    print('ValueError',e)
except Exception as e:
    print('Exception',e)
else:
    print('try代码块中没有引发异常时,执行')
finally:
    print('无论是否引发了异常,都会执行这个代码块')

print('如果上面的代码有异常并且进行了处理,那么后面的代码将继续执行')


# 7。使用 raise ,主动抛出异常
try:
    #可以使用 raise 主动抛出异常,并设置异常信息
    raise Exception('发生错误')
except Exception as e:
    print('Exception',e)


#8。 assert 断言
assert 1 == 1 # 如果后面的表达式正确,则什么也不做
assert 2 == 1 # 如果后面的表达式错误,则直接抛出 AssertionError

自定义异常处理类

当异常出现时,对异常信息进行写入日志。

traceback 回溯模块 https://docs.python.org/3.7/library/traceback.html
logging 日志模块 https://docs.python.org/3.7/library/logging.html
# 自定义异常日志处理类
class Myexception():
    def __init__(self):
        import traceback
        import logging

        # logging的基本配置
        logging.basicConfig(
            filename='./error.log',# 日志存储的文件及目录
            format='%(asctime)s  %(levelname)s \n %(message)s',# 格式化存储的日志格式
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        # 写入日志
        logging.error(traceback.format_exc())

# 使用自定义异常处理类
try:
    int('bb')
except:
    print('在此处进行异常的处理')
    Myexception() # 在异常处理的代码块中去调用自定义异常类

标准的异常类

BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告
Image placeholder
释果慧
未设置
  0人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Python 异常处理笔记

什么是异常? 异常简单理解,就是非正常,没有达到预期目标。异常是一个事件,并且这个异常事件在我们程序员的运行过程中出现,会影响我们程序正常执行。 异常分两种: 1.语法错误导致的异常 2.逻辑错误

流畅的Python读书笔记 --- 第一章 Python数据模型

近期开始读“流畅的Python”这本书,想把自己的读书笔记分享给大家,希望能帮到也对这本书感兴趣但是没时间看的各位。(文章中大部分的话和图片摘录总结自“流畅的Python”一书,以及python官方网

Spring Boot 中关于自定义异常处理的套路!

在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们

Python 教程-了解Python

什么是Python Python能干什么? 有什么特点? 什么是Python 官方介绍: Python是一个易于学习、功能强大的编程语言。它拥有高效高级的数据结构和一种简单有效的面向对象编程的

Python 教程-Python 安装

在Windows上安装 访问https://www.python.org/downloads/并下载最新版本。在撰写时当前最新是3.8。在安装的时候和其他软件一样,无脑式下一步。需要注意的是如果在W

Python入门教程_2. 使用 Python 解释器

2.1.调用解释器 Python解释器通常安装在目标机器上的/usr/local/bin/python3.7目录下;把/usr/local/bin目录放进你的Unixshell的搜索路径里,确保它可以

Python入门教程_3. Python 简介

在下面的例子中,输入和输出分别由大于号和句号提示符(>>>和...)标注:如果想重现这些例子,就要在解释器的提示符后,输入(提示符后面的)那些不包含提示符的代码行。需要注意的是在练习中遇到的从属提示符

Python入门教程_4. 深入 Python 流程控制

除了刚刚介绍的while语句,Python还有一些在其他语言中常见的控制流语句,并做了一些改动。 4.1.if语句 也许最著名的语句是if语句了。 例如: >>>x=int(input("Please

【python测试开发栈】帮你总结python random模块高频使用方法

随机数据在平时写python脚本时会经常被用到,比如随机生成0和1来控制逻辑、或者从列表中随机选择一个元素(其实抽奖程序也类似,就是从公司所有人中随机选择中奖用户)等等。这篇文章,就帮大家整理在pyt

【python测试开发栈】帮你总结python time模块高频使用方法

在平时写python脚本时,时间是我们经常用到的数据,比如:时间戳、前端展示的对应格式的时间等,在python中主要有三个和时间处理相关的模块:time、datetime、calendar,这篇文章主

python 处理多个异常

处理多个异常 我们可以使用三种方法来处理多个异常。 第一种方法需要把所有可能发生的异常放到一个元组里。像这样: try: file=open('test.txt','rb') except(IOErr

推荐:10个Python图像处理工具

概述了一些常用的Python库,它们提供了一种简单直观的图像转换方法。介绍在我们今天的世界中有很多的数据,而图像是这些数据中的重要组成部分。但是,要使用这些图像,需要对它们进行处理。因此,图像处理是分

Python中的系统内置模块笔记

系统内置模块就是按照python解释器后,系统给提供的模块 在需要时可以导入后使用,例如:json,re,os。。。 序列化模块 序列化是指可以把python中的数据,以文本或二进制的方式进行转

Python time时间模块笔记

time时间模块 importtime ''' 概念: 1。时间戳:1574905882.6581771表示从1970年1月1日0时0分0秒到现在的一个秒数,目前可以计算到2

Python 初识面向对象笔记

面向对象编程——ObjectOrientedProgramming,简称OOP,是一种以对象为中心的程序设计思想。 面向过程编程——ProcedureOrientedProgramming,简称PO

流畅的python学习笔记-第4章

第4章文本和字节序列[toc]编码和解码markdom可以插入emoji表情包其中作为前缀,x1f54为对应表情的unicode编码🥺emoji 把码位转换成字节序列的过程是编码;把字节序列转换成码位

流畅的python学习笔记-第5章

第5章函数[toc]函数在python中一切都可以视作为对象,包括函数deffunction_try(): '''itisfuncitontrydoc''' print('function_tryd

Python 面向对象 OOP-三大特性笔记

面向对象的三大特性:封装,继承,多态 封装 封装就是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的但是一定注意,不能把成员全部封装死,就失去意义了被封装的成员主要是供类的内部

Python 面向对象 OOP-三大特性笔记

面向对象的三大特性:封装,继承,多态 封装 封装就是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的但是一定注意,不能把成员全部封装死,就失去意义了被封装的成员主要是供类的内部

Python 面向对象 高阶-描述符与设计模式笔记

描述符 当一个类中,包含了三个魔术方法(__get__,__set__,__delete__)之一,或者全部时,那么这个类就称为描述符类 作用 描述符的作用就是对一个类中的某个成员进行一个详细的

初识python脚本笔记

编写python程序的文件,称为python的脚本或程序要求当前的python脚本的文件后缀名必须是.py pycharm使用注意 需要明确的知道你当前pycharm选择的python环境 注

初识python脚本笔记

编写python程序的文件,称为python的脚本或程序要求当前的python脚本的文件后缀名必须是.py pycharm使用注意 需要明确的知道你当前pycharm选择的python环境 注

超8千Star,火遍Github的Python反直觉案例集!

大数据文摘授权转载作者:SatwikKansal译者:暮晨Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。但有的时候,Python的一些输出结果对于初学者来说似

{