《Python编程实训快速上手》第九天--调试技巧

一、抛异常

异常类型分为两类,第一类是Python自带的异常类型(见《Python编程快速上手》第一天---前三章打基础),第二类是自定义异常。

面对自定义异常类型,使用raise抛异常,类型值默认为Exception:

raise Exception("xxxxxxx")

  • raise关键字。
  • Exception()函数的调用。
  • 传递给Exception()函数的字符串,包含有用的错误信息。
def boxPrint(symbol, width, height):if len(symbol) != 1:❶ raise  Exception('Symbol  must  be  a  single  character  string.')if width &lt <= 2:❷ raise Exception('Width must be greater than 2.')if height &lt <= 2:❸ raise Exception('Height must be greater than 2.')print(symbol * width)for i in range(height - 2):print(symbol + (' ' * (width - 2)) + symbol) print(symbol * width)for sym, w, h in (('*', 4, 4), ('O', 20, 5), ('x', 1, 3), ('ZZ', 3, 3)):try:boxPrint(sym, w, h)❹ except Exception as err:❺ print('An exception happened: ' + str(err))

当前程序中使用了except语句的except Exception as err形式。如果boxPrint()返回一个Exception对象❶❷❸,那么这条except语句就会将该对象保存在名为err的变量中。Exception对象可以传递给str()以将它转换为一个字符串,从而得到对用户友好的错误信息 。

 二、取得回溯字符串

如果Python遇到错误,它就会生成一些错误信息,称为“回溯”。错误信息组成的序列称为“调用栈”。顾名思义,报错信息最下边是报错内容,往上是层层函数调用记录,显示了代码的执行路径。

导入Python的traceback模块,调用traceback.format_ exc()可以得到其字符串形式,该形式可用于写入文件中。

三、断言

“断言”是健全性检查,用于确保代码没有做什么明显错误的事情。

  • assert关键字。
  • 条件(即求值为TrueFalse的表达式)。
  • 逗号。
  • 当条件为False时显示的字符串。

程序开发时使用断言,因为断言发生错误会直接崩溃。
程序正常运行中抛出异常,处理可能遇到的那些错误(如文件没有找到,或用户输入了无效的数据)。不应使用assert语句来引发异常,因为用户可以选择关闭异常。 

四、日志

1、使用logging模块

要启用logging模块以在程序运行时将日志消息显示在屏幕上,请将下面的代码复制到程序顶部:

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s-  %(message)s')

之后使用logging.debug()函数输出日志消息,这个debug()函数将调用basicConfig()以输出一行信息。这行信息的格式是我们在basicConfig()函数中指定的。

例如:输出n的阶乘

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s-  %(message)s')
logging.debug('Start of program')def factorial(n):logging.debug('Start of factorial(%s%%)'  % (n))total  =   1for i in range(1,n + 1):total *= ilogging.debug('i is ' +  str(i) +  ', total is ' +  str(total))logging.debug('End of factorial(%s%%)' % (n))return totalprint(factorial(5))
logging.debug('End of program')

白色字体是print()输出结果,红色字体是日志内容 

2、不可使用print()代替

不使用print()是因为在调试完成后,你需要花很多时间从代码中清除每条日志消息的print()调用。

使用日志消息的好处在于,你可以在程序中想加多少就加多少,稍后只要加入一次logging.disable()调用就可以禁止日志,不像print()需逐条清除。

3、日志级别

5个日志级别从最不重要到最重要划分
级别日志函数描述
DEBUGlogging.debug()最低级别。用于小细节。通常只有在诊断问题时,你才会关心这些消息
INFOlogging.info()用于记录程序中一般事件的信息,或确认一切工作正常
WARNINGlogging.warning()用于表示可能的问题,它在当前不会阻止程序的工作,但将来可能会
ERRORlogging.error()用于记录错误,它导致程序做某事失败
CRITICALlogging.critical()最高级别。用于表示致命的错误,它导致或将会导致程序完全停止工作

划分日志级别的好处在于,可以改变希望看到的日志消息的优先级。传入level关键字参数级别越低,能看到的日志消息越多。

4、禁用日志

5、将日志记录到文件

logging.basic Config()函数可以接收filename关键字参数 。

import logging
logging.basicConfig(filename='myProgramLog.txt', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

相关新闻

P4-1【应用数组进行程序设计】第一节——知识要点:一维数组

P4-1【应用数组进行程序设计】第一节——知识要点:一维数组

视频&#xff1a; P4-1【应用数组进行程序设计】第一节——知识要点&#xff1a;一维数组 项目四 应用数组进行程序设计 任务一&#xff1a;冒泡排序 知识要点&#xff1a;一维数组 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 用冒泡法对任意输入…

2026/7/17 12:21:32 阅读更多 →
深度学习笔记之BERT(二)BERT精简变体:ALBERT

深度学习笔记之BERT(二)BERT精简变体:ALBERT

深度学习笔记之BERT——BERT精简变体:ALBERT 引言回顾&#xff1a;ResNet对于反向传播的作用BERT的配置BERT的问题/缺陷ALBERTALBERT的策略BERT VS ALBERT 引言 上一节从 Word2vec \text{Word2vec} Word2vec上下文信息的局限性角度出发&#xff0c;介绍了 BERT \text{BERT} BE…

2026/7/18 8:18:27 阅读更多 →
一个小的可编辑表格问题引起的思考

一个小的可编辑表格问题引起的思考

11.21工作中遇到的问题 预期&#xff1a;当每行获取红包金额的时候若出现错误&#xff0c;右侧当行会出现提示 结果&#xff1a;获取红包金额出现错误&#xff0c;右侧对应行并没有出现错误提示 我发现&#xff0c;当我们设置readonly的时候&#xff0c;其实render函数依旧是…

2026/7/15 18:43:05 阅读更多 →
南昌黄金回收三家门店实测|带实物探店,报价/称重/服务全客观对比 - GrowUME

南昌黄金回收三家门店实测|带实物探店,报价/称重/服务全客观对比 - GrowUME

南昌黄金回收三家门店实测|带实物探店,报价/称重/服务全客观对比 最近金价持续走高,不少粉丝私信问南昌哪家黄金回收靠谱,怕遇到虚高报价、隐形损耗、鬼秤压价。作为本地生活博主,我整理了家里闲置足金项链、古法…

2026/7/19 19:46:37 阅读更多 →
【React】状态提升模式:设计原理、权衡分析与架构决策框架

【React】状态提升模式:设计原理、权衡分析与架构决策框架

摘要 状态提升&#xff08;Lifting State Up&#xff09;是 React 框架中处理组件间状态共享的核心模式&#xff0c;其本质为单向数据流思想的自然延伸。本文从状态所有权、数据流方向与组件职责分离三个维度&#xff0c;系统阐释状态提升的设计原理与实现机制&#xff0c;并深…

2026/7/19 19:46:37 阅读更多 →
Kotlin与Flutter技术对比:移动开发选型指南

Kotlin与Flutter技术对比:移动开发选型指南

1. Kotlin与Flutter的技术定位解析 当我在2018年第一次接触Kotlin时&#xff0c;它刚被Google宣布为Android开发的官方语言。而Flutter在2017年发布后&#xff0c;我见证了它如何从一个实验性框架成长为如今的跨平台解决方案巨头。这两种技术看似平行发展&#xff0c;实则代表了…

2026/7/19 19:47:41 阅读更多 →
【Kimi编程辅助黄金配置清单】:VS Code + JetBrains双环境最优参数设置,错过再等半年

【Kimi编程辅助黄金配置清单】:VS Code + JetBrains双环境最优参数设置,错过再等半年

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Kimi编程辅助的核心能力与适用场景 Kimi 编程辅助依托超长上下文理解&#xff08;支持高达200万字输入&#xff09;与多模态代码感知能力&#xff0c;构建了面向开发者的一站式智能编码支持体系。其核心并非简…

2026/7/19 19:47:41 阅读更多 →
炼丹炉电商数据测评:从数据采集到决策闭环的完整解决方案

炼丹炉电商数据测评:从数据采集到决策闭环的完整解决方案

最近在帮几个电商团队做数据选型时&#xff0c;我发现了一个很有意思的现象&#xff1a;很多团队在选数据服务时&#xff0c;往往只关注"能不能爬数据"&#xff0c;却忽略了更关键的问题——这些数据到底能不能真正指导业务决策&#xff1f; 今天要测评的炼丹炉电商…

2026/7/19 19:47:41 阅读更多 →
别再手动筛选了!ChatGPT自动关联兴趣画像+消费习惯+社交语境的礼物推荐引擎上线

别再手动筛选了!ChatGPT自动关联兴趣画像+消费习惯+社交语境的礼物推荐引擎上线

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;别再手动筛选了&#xff01;ChatGPT自动关联兴趣画像消费习惯社交语境的礼物推荐引擎上线 传统礼物推荐依赖人工经验与碎片化信息拼凑&#xff0c;效率低、泛化差、易忽略隐性偏好。如今&#xff0c;我们构建了…

2026/7/19 19:47:41 阅读更多 →
鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战&#xff1a;Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析 前言 Emoji Idiom Guess 是一个基于鸿蒙 ArkTS 编写的单页互动应用&#xff0c;核心围绕 表情线索、答案输入、首字母提示和收藏关卡 展开。项目没有依赖复杂服务端&#xff0c;也没有把逻辑…

2026/7/19 0:00:03 阅读更多 →
Unity与Python本地通信:基于Flask的跨语言数据交换实战

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:04 阅读更多 →
科研课题设计全流程:从选题到成果落地的实战指南

科研课题设计全流程:从选题到成果落地的实战指南

1. 课题设计全流程解析&#xff1a;从选题到成果落地的实战指南课题设计是科研工作者、高校师生以及企业研发人员日常工作中的核心环节。一个优秀的课题设计不仅决定了研究的方向和质量&#xff0c;更直接影响最终成果的学术价值和应用前景。作为在科研一线摸爬滚打多年的从业者…

2026/7/19 0:00:04 阅读更多 →
鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战&#xff1a;Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析 前言 Emoji Idiom Guess 是一个基于鸿蒙 ArkTS 编写的单页互动应用&#xff0c;核心围绕 表情线索、答案输入、首字母提示和收藏关卡 展开。项目没有依赖复杂服务端&#xff0c;也没有把逻辑…

2026/7/19 0:00:03 阅读更多 →
Unity与Python本地通信:基于Flask的跨语言数据交换实战

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:04 阅读更多 →
科研课题设计全流程:从选题到成果落地的实战指南

科研课题设计全流程:从选题到成果落地的实战指南

1. 课题设计全流程解析&#xff1a;从选题到成果落地的实战指南课题设计是科研工作者、高校师生以及企业研发人员日常工作中的核心环节。一个优秀的课题设计不仅决定了研究的方向和质量&#xff0c;更直接影响最终成果的学术价值和应用前景。作为在科研一线摸爬滚打多年的从业者…

2026/7/19 0:00:04 阅读更多 →
ai agent框架spring ai/alibaba 源码原理分析(六) agent和组件

ai agent框架spring ai/alibaba 源码原理分析(六) agent和组件

简介 saa是java的ai agent框架&#xff0c;本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理&#xff0c;不仅可以指导agent的开发&#xff0c;更可以改造框架&#xff0c;增加新特性 系列内容&#xff1a; 系列(一) 架构 完成 系列(三) 调用 I 工具 完成 II M…

2026/7/19 0:01:20 阅读更多 →
终极指南:如何用Steam-auto-crack实现Steam游戏自动破解

终极指南:如何用Steam-auto-crack实现Steam游戏自动破解

终极指南&#xff1a;如何用Steam-auto-crack实现Steam游戏自动破解 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam-auto-crack是一款功能强大的Steam游戏自动破解工具&#xff…

2026/7/19 9:10:31 阅读更多 →
移动端游戏功耗测试实战:电流、功率、亮度和场景对比

移动端游戏功耗测试实战:电流、功率、亮度和场景对比

移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…

2026/7/19 19:29:48 阅读更多 →