大家好,我是大华!
Python 的学习来到了第5天,今天来看看异常的处理和程序调试。
第一部分:异常处理基础
1.1 什么是异常?
看看没有异常处理的程序会发生什么
print("程序开始...")# 这些代码会引发异常result = 10 / 0 # ZeroDivisionError: division by zeroprint("程序结束...") # 这行永远不会执行
1.2 基本的try-except结构
最基本的异常捕获
print("程序开始...")try: result = 10 / 0 print(f"结果是:{result}")except: print("哎呀,出错了!")print("程序继续执行...") # 程序不会崩溃,继续执行
输出结果
程序开始...哎呀,出错了!程序继续执行...
第二部分:精确异常处理
2.1 捕获特定类型的异常
方法1:捕获特定异常
try: number = int(input("请输入一个数字:")) result = 10 / number print(f"10除以{number}的结果是:{result}")except ZeroDivisionError: print("错误:除数不能为零!")except ValueError: print("错误:请输入有效的数字!")
输出结果
# 在输入0点情况下输出请输入一个数字:0错误:除数不能为零!# 输入非0的情况下,比如我这里输入10请输入一个数字:1010除以10的结果是:1.0
方法2:捕获多个异常
try: file = open("不存在的文件.txt", "r") content = file.read()except (FileNotFoundError, PermissionError): print("无法打开文件,请检查文件是否存在和权限")
2.2 获取异常信息
try: num = int("abc")except ValueError as e: print(f"发生值错误:{e}") print(f"异常类型:{type(e)}") print(f"异常消息:{str(e)}")
输出结果
发生值错误:invalid literal for int() with base 10: 'abc'异常类型:<class 'ValueError'>异常消息:invalid literal for int() with base 10: 'abc'
2.3 完整的try-except-else-finally结构
def divide_numbers(a, b): try: result = a / b except ZeroDivisionError: print("除数不能为零!") return None except TypeError: print("请输入数字类型!") return None else: print("计算成功!") return result finally: print("无论是否发生异常,都会执行这里") print("通常用于清理资源,如关闭文件、数据库连接等")# 测试print(divide_numbers(10, 2)) # 正常情况print(divide_numbers(10, 0)) # 除零错误print(divide_numbers(10, "2")) # 类型错误
输出结果
计算成功!无论是否发生异常,都会执行这里通常用于清理资源,如关闭文件、数据库连接等5.0除数不能为零!无论是否发生异常,都会执行这里通常用于清理资源,如关闭文件、数据库连接等None请输入数字类型!无论是否发生异常,都会执行这里通常用于清理资源,如关闭文件、数据库连接等None
第三部分:程序调试思维
3.1 常见的调试方法
方法1:print调试法(最简单直接)
def calculate_average(scores): print(f"调试:输入的数据是 {scores}") # 查看输入 total = sum(scores) print(f"调试:总和是 {total}") # 查看中间结果 average = total / len(scores) print(f"调试:平均值是 {average}") # 查看最终结果 return averagescores = [80, 90, 85, 95, 100]average = calculate_average(scores)print(f"平均分是 {average}")
这里使用了一个计算总和的内置函数 sum()。
输出结果
调试:输入的数据是 [80, 90, 85, 95, 100]调试:总和是 450调试:平均值是 90.0平均分是 90.0
方法2:使用assert断言
def calculate_discount(price, discount_rate): assert price > 0, "价格必须大于0" assert 0 <= discount_rate <= 1, "折扣率必须在0-1之间" discounted_price = price * (1 - discount_rate) return discounted_price# 测试断言print(calculate_discount(100, 0.2)) # 正常# print(calculate_discount(-100, 0.2)) # 触发断言:AssertionError: 价格必须大于0
3.2 使用logging进行调试
import logging# 配置日志logging.basicConfig( level=logging.DEBUG, # 设置日志级别 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')def process_data(data): logging.debug(f"开始处理数据:{data}") try: result = sum(data) / len(data) logging.info(f"数据处理成功,结果:{result}") return result except ZeroDivisionError: logging.error("数据列表为空") return None except TypeError as e: logging.error(f"数据类型错误:{e}") return None# 测试process_data([1, 2, 3, 4, 5])process_data([])process_data([1, '2', 3])
输出结果
2026-02-02 08:58:33,438 - root - DEBUG - 开始处理数据:[1, 2, 3, 4, 5]2026-02-02 08:58:33,439 - root - INFO - 数据处理成功,结果:3.02026-02-02 08:58:33,439 - root - DEBUG - 开始处理数据:[]2026-02-02 08:58:33,439 - root - ERROR - 数据列表为空2026-02-02 08:58:33,439 - root - DEBUG - 开始处理数据:[1, '2', 3]2026-02-02 08:58:33,439 - root - ERROR - 数据类型错误:unsupported operand type(s) for +: 'int' and 'str'
3.3 使用pdb进行交互式调试
import pdbdef find_bug_in_code(numbers): total = 0 count = 0 # 在这里设置断点 pdb.set_trace() # 程序会在这里暂停,进入调试模式 for num in numbers: total += num count += 1 average = total / count # 这里可能有bug! return averagefind_bug_in_code([10, 20, 30, 40, 50])
在pdb调试模式中可以:
这是我在vscode的调试示例

今天的内容没有很多,如果有不对或者需要补充的地方,欢迎指正。
如果你觉得文章写的还不错,不妨点赞、推荐,转发给你的朋友看一下。