Python个人学习笔记(18):模块(异常处理、traceback、日志记录)

七、异常处理

语法错误不属于异常,处理的是程序运行时的一些意外情况
代码:

a = int(input('>>>:'))
b = int(input('>>>:'))
print(a / b) # 在运行的时候由于数据不对,导致出错
# 此时程序会中断
print('我要上天')

结果:
Traceback (most recent call last):
File “D:\PycharmProjects\樵夫老师Python零基础课程\4_模块\39_python的异常处理.py”, line 3, in
print(a / b)
^
ZeroDivisionError: division by zero

如果异常不处理,那么程序会中断
语法:
try:
xxx
except 类型 as 变量:
xxxxx
except 类型 as 变量:
xxxxx

else:
xxxx
finally:
xxxx

尝试运行一段代码,如果不出错,就正常结束,如果出错,自动运行except内容
代码:

a = int(input('>>>:'))
b = int(input('>>>:'))
try:print(a / b)
except:print("出错了。。。")print('我要上天')

结果:

>>>10
>>>2
5.0
我要上天
>>>10
>>>0
出错了。。。
我要上天

不打断程序的后续运行
在except中需要错误信息
在try中收集错误信息,然后传递给except
语法:except Exception as e:
exception:错误类型
e:错误信息的接受变量

代码:

a = int(input('>>>:'))
b = int(input('>>>:'))
try:print(a / b)
except ZeroDivisionError as e:print("出错了。。。", e)print('我要上天')

结果:

>>>10
>>>0
出错了。。。 division by zero
我要上天

根据可能发生的问题,可以分列多个except

try:a = int(input('>>>:'))b = int(input('>>>:'))print(a / b)
except ZeroDivisionError as e:print("小错误", e)
except TypeError as e:print("中错误", e)
except Exception as e:print("大错误", e)
else: # 不出错走else,基本用不上pass
finally: #最终收尾,无论报不报错,比如数据库操作完毕后都需要关闭链接print("最终收尾")print('我要上天')

exception可以接收其他错误

实际应用中,不会写的像上面那么复杂,最多为下面的结构

try:pass # 程序内容
except Exception as e:pass
finally:pass

在函数中使用try
代码:

def func():try:print(1/0)except Exception as e:return 123finally:print("我是Finally")r = func()
print(r)

结果:

我是Finally
123

在try里面的return不会打断finally的运行,但如果return在try之前,那么函数终止,不会运行try

八、traceback模块

try-execept提供的信息量太少,需要借助traceback
代码:

import tracebacktry:print(1/0)
except Exception as e:print(traceback.format_exc())

结果:
Traceback (most recent call last):
File “D:\PycharmProjects\樵夫老师Python零基础课程\4_模块\40_traceback.py”, line 4, in
print(1/0)
^
ZeroDivisionError: division by zero

结果显示调用栈(错误信息),但字体不是红色的
代码调试期间用try-except-traceback,上线后不要留

九、logging模块:日志记录

代码不用记,是固定的,不需要自己手动写

import logging# 基础配置
logging.basicConfig(filename='x1.txt', # 文件名format='%(asctime)s-%(name)s-%(levelname)s -%(module)s:NBSP %(message)s',# 日志的格式:时间、日志名字、错误级别、模块、事件datefmt='%Y-%m-%d %H:%M:%S', # 时间格式level=30) # 被记录日志中的错误等级,只有level≥30的信息会被记录

当前配置表示 10以上的分数会被写入文件
logging模块自动划分了一些日志等级
logging.CRITICAL:最高级别错误,50
logging.ERROR:普通错误,40
logging.WARNING:警告,30
logging.INFO:信息,20
logging.DEBUG:最详细,10

代码:

logging.error("我上天了") # level=40
logging.info("我感冒了") # level=20

结果:
在这里插入图片描述
设置的级别为30及以上,因此info的信息没有记录进去
项目上线之前,可以把level降很低,把所有日志信息都记录下来,上线之后把level调高,减少日志信息

logging.log(18,“我想上厕所”):自行设置一个18级的信息,不推荐

完整的错误处理逻辑:
代码:

import traceback
try:print(1/0)
except Exception as e:logging.error(traceback.format_exc())

结果:
在这里插入图片描述
自动记下了错误的信息

如果项目极其庞大,可以考虑设置多个日志
代码:

#配置一个操作日志的对象logger(依赖FileHandler)
file_handler = logging.FileHandler('11.log','a',encoding='utf-8') # 避免乱码
file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s -%(name)s-%(levelname)s -%(module)s: %(message)s"))logger1 = logging.Logger('s1',level=logging.ERROR)
logger1.addHandler(file_handler)logger1.error('我是A系统')#再设置一个操作日志的对象logger(依赖FileHandler)
file_handler2 = logging.FileHandler('12.log','a', encoding='utf-8')
file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s -%(name)s -%(levelname)s -%(module)s:%(message)s"))logger2 =logging.Logger('s2',level=logging.ERROR)
logger2.addHandler(file_handler2)logger2.error('我是B系统')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36522.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AnyTouch:跨多个视觉触觉传感器学习统一的静态动态表征

25年3月来自人大、武汉科技大学和北邮的论文“AnyTouch: Learning Unified Static-dynamic Representation Across Multiple Visuo-tactile Sensors”。 视觉触觉传感器旨在模拟人类的触觉感知,使机器人能够精确地理解和操纵物体。随着时间的推移,许多精…

【数据分享】1999—2023年地级市固定资产投资和对外经济贸易数据(Shp/Excel格式)

在之前的文章中,我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据、房地产投资情况和商品房销售面积相关指标数据、社会消费品零售总额和年末金融机构存贷款余额、各类用地面积、地方一般公共预算…

(位运算 水题?407周赛题?o 使两个整数相等的位更改次数)leetcode 3226

思路 :灵茶山艾府 怎么判断n能构成k直接异或取1的数量就行 关键在于如何判断n无法构成k 按照灵茶山大佬的方案一就是让k是n的子集也就是n与k的交集等于k 不等于k就不是n的子集 (当k是n的子集时 n能构成k) 与运算取交集,或运算取…

使用DDR4控制器实现多通道数据读写(四)

在创建完DDR4的仿真模型后,我们为了实现异步时钟的读写,板卡中在PL端提供了一组差分时钟,可以用它通过vivado中的Clock Wizard IP核生成多个时钟,在这里生成两个输出时钟,分别作为用户的读写时钟,这样就可以…

Linux 文件操作-标准IO函数4-fseek设置文件偏移量、ftell获取当前偏移量、rewind使文件偏移量(为0)定位到开头

目录 1.fseek设置文件偏移量 2.ftell获取当前偏移量 3.rewind使文件偏移量(为0)定位到开头 4.程序验证 1.fseek设置文件偏移量 函数原型: /* 功能:设置文件位置指针的偏移量 参数: stream:文件指针 of…

JavaEE的知识记录

内容很多可以通过目录进行查找对应的内容。 目录 一、注解 元注解 RequestMapping 路由映射注解 RequestParam绑定请求参数到可控制器方法的参数 请求参数绑定可控制方法参数: 参数绑定重命名 RequestBody请求正文注解 ResponseBody响应体正文注解 PathVar…

带旋转的目标标注工具-X-AnyLabeling

在之前的文章中, 分别介绍过3款标注工具: 目标检测,语义分割标注工具–labelimg labelme智能标注工具 T-Rex Label 对于2D目标检测标注, 上面的工具只能标注不带旋转的检测框。但是如果我们要进行带旋转方向的检测(O…

Javascript基础

目录 1. 变量声明2. 基本数据类型3.复杂数据类型4.字符串方法5.对象方法6.时间方法7.条件(if)8.循环(for/while)9.遍历(for in/of)10.多选(Switch)END 1. 变量声明 const&#xff1…

设计模式之建造者模式

目录 1. 概念 2. 代码实现 3. 应用场景 建造者模式(Builder)是创建型设计模式的最后一个,但是确实在平时开发过程中或者阅读源码过程中是十分常见的,难度在我来看是比较适中的,理解起来的也比较轻松,并且平时我们在编码过程中也…

【NeurIPS-2022】CodeFormer: 将人脸复原转化为码本预测以减少LQ-HQ映射的不确定性

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言论文动机方法实验 总结互动致谢参考往期回顾 前言 盲人脸恢复是一个高度不适定的…

JAVA-多线程join()等待一个线程

引言:更多线程的认识可以看一篇博客: JAVA-Thread类实现多线程-CSDN博客 一、join()的作用 我们知道线程是随机调度执行的,但是有时候我们需要另一个任务完成了,我们才能继续,这个时候我们就可以使用join去等待线程结束…

《AI大模型开发笔记》——企业RAG技术实战

RAG(Retrieval-Augmented Generation)介绍 Retrieval-Augmented Generation for Large Language Models: A Survey: https://arxiv.org/abs/2312.10997 github项目: https://github.com/Tongji-KGLLM/RAG-Survey RAGFlow项目 ragflow项目地址: https://github.com/inf…

蓝桥杯备考:特殊01背包问题——》集合subset

我们划分成两个集合,实际上我们只需要看一部分就行了,也就是从集合的所有元素里挑出恰好满足集合总和的一半儿,当然,如果我们的集合总和是奇数的话,我们是无论如何也挑不出刚好一半儿的,因为我们没有小数&a…

python字符级差异分析并生成 Word 报告 自然语言处理断句

import difflib from docx import Document from docx.shared import RGBColor from snownlp import SnowNLPdef analyze_char_differences(text_a, text_b):"""分析两个文本的字符级差异:param text_a: 第一个文本:param text_b: 第二个文本"""…

尝试在软考66天前开始成为软件设计师-数据库系统

三级模式-两级映射 层次型架构设计 ---便利,应变能力↗ 外模式 (用户与数据库系统的接口 视图概念模式 (数据库中全体数据的逻辑结构和特征内模式 (数据物理结构和存储方式 外模式/模式映像。 该映像存在于外部级和概念级之间,实现了外模式到概念模式…

Hadoop•常用命令

听说这是目录哦 操作命令🥯退出清屏切换工作目录移动文件查看创建删除复制文件内容查看编辑解压缩其它命令技巧 系统命令🍕vim操作命令(命令模式下)光标移动复制粘贴(vi编辑器内部)删除、撤销 若vi,vim,ls找不到命令⚠️能量站&am…

linux之 内存管理(1)-armv8 内核启动页表建立过程

一、内核启动时,页表映射有哪些? Linux初始化过程,会依次建立如下页表映射: 1.恒等映射:页表基地址idmap_pg_dir; 2.粗粒度内核镜像映射:页表基地址init_pg_dir; 3.fixmap映射:页表基地址为…

IntelliJ IDEA 快捷键系列:重命名快捷键详解

目录 引言一、默认重命名快捷键1. Windows 系统‌2. Mac 系统‌ 二、操作步骤与技巧1. 精准选择重命名范围‌2. 智能过滤无关内容‌ 三、总结 引言 在代码重构中,‌重命名变量、类、方法‌ 是最常用的操作之一。正确使用快捷键可以极大提升开发效率。本文针对 ‌Ma…

Swagger-告别手写文档

文章目录 1. 引言2. Swagger是什么?3. SpringBoot2.7.3集成Swagger4. 常见注解 1. 引言 在RESTful API开发中,维护准确、易读的接口文档是团队协作的核心挑战,通常接口文档分为离线的和实时的。离线的接口文档工具有 YAPI等,其中…

深入解析 C++ Vector:全面掌握 STL 核心容器的原理与高效实践

一、Vector 的核心概念与特性 Vector 是 C 标准库中最常用的动态数组容器,其底层基于连续内存存储元素,兼具数组的高效访问与动态扩容的灵活性。以下是其核心特性: 1.1 核心特性对比 特性普通数组Vector 容器内存分配静态固定动态增长访问效…