百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

30天学会Python编程:10. Python异常处理与调试

itomcoil 2025-08-03 05:28 6 浏览

10.1 异常处理基础

10.1.1 异常处理机制

10.1.2 基本语法结构

try:
    # 可能引发异常的代码
except ExceptionType as e:
    # 异常处理代码
else:
    # 无异常时执行
finally:
    # 无论是否异常都执行

10.2 常见异常类型

10.2.1 内置异常层次

10.2.2 主要异常类型

表10-1 Python常见异常类型

异常类型

触发场景

示例

ValueError

值无效

int("abc")

TypeError

类型错误

"a" + 1

IndexError

索引越界

[1,2][3]

KeyError

键不存在

{}["key"]

FileNotFoundError

文件未找到

open("nonexist.txt")

ZeroDivisionError

除零错误

1/0

AttributeError

属性错误

"".no_method()

10.3 异常处理进阶

10.3.1 多异常处理

try:
    # 可能出错的代码
except (ValueError, TypeError) as e:
    print(f"输入错误: {e}")
except FileNotFoundError as e:
    print(f"文件未找到: {e.filename}")
except Exception as e:
    print(f"未知错误: {e}")

10.3.2 异常链与上下文

try:
    import nonexistent_module
except ImportError as e:
    raise RuntimeError("依赖缺失") from e

10.3.3 自定义异常

class MyAppError(Exception):
    """应用基础异常"""
    
class InvalidInputError(MyAppError):
    """输入无效异常"""
    def __init__(self, input_value):
        self.input_value = input_value
        super().__init__(f"无效输入: {input_value}")

# 使用示例
def process(data):
    if not data.isdigit():
        raise InvalidInputError(data)
    return int(data)

10.4 调试技术

10.4.1 print调试法

def complex_calculation(a, b):
    print(f"输入参数: a={a}, b={b}")  # 调试输出
    result = a * b
    print(f"中间结果: {result}")      # 调试输出
    result += 100
    return result

10.4.2 断言调试

def divide(a, b):
    assert b != 0, "除数不能为零"
    return a / b

# 触发断言
divide(10, 0)  # AssertionError: 除数不能为零

10.4.3 logging模块

import logging

# 配置日志
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='app.log'
)

def process_data(data):
    logging.debug(f"开始处理数据: {data}")
    try:
        result = int(data)
        logging.info(f"处理成功: {result}")
        return result
    except ValueError as e:
        logging.error(f"处理失败: {e}")
        raise

10.5 使用调试器

10.5.1 pdb基本命令

表10-2 pdb常用命令

命令

缩写

功能

break

b

设置断点

continue

c

继续执行

next

n

单步执行(不进入函数)

step

s

单步执行(进入函数)

where

w

显示调用栈

print

p

打印变量

list

l

显示当前代码

quit

q

退出调试器

10.5.2 调试示例

# 在代码中插入断点
import pdb; pdb.set_trace()

# 或者命令行启动
# python -m pdb script.py

10.6 单元测试

10.6.1 unittest示例

import unittest

def add(a, b):
    return a + b

class TestAdd(unittest.TestCase):
    def test_add_integers(self):
        self.assertEqual(add(1, 2), 3)
    
    def test_add_strings(self):
        self.assertEqual(add("a", "b"), "ab")
    
    def test_add_type_error(self):
        with self.assertRaises(TypeError):
            add("a", 1)

if __name__ == "__main__":
    unittest.main()

10.6.2 pytest示例

# test_sample.py
import pytest

def test_addition():
    assert 1 + 1 == 2

def test_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0

# 运行测试
# pytest test_sample.py -v

10.7 性能分析

10.7.1 timeit模块

from timeit import timeit

# 测量代码执行时间
time = timeit('"-".join(str(n) for n in range(100))', number=10000)
print(f"执行时间: {time:.4f}秒")

10.7.2 cProfile分析

import cProfile

def slow_function():
    return sum(i*i for i in range(1000000))

cProfile.run('slow_function()')

10.8 综合应用举例

案例1:健壮的数据处理器

import logging
from typing import Union

logging.basicConfig(level=logging.INFO)

class DataProcessor:
    """带有完善错误处理的数据处理器"""
    
    def __init__(self, max_retries=3):
        self.max_retries = max_retries
    
    def process(self, data: Union[str, int, float]) -> float:
        """处理输入数据返回浮点数"""
        for attempt in range(1, self.max_retries + 1):
            try:
                value = float(data)
                if value < 0:
                    logging.warning(f"负值输入: {value}")
                return value
            except (ValueError, TypeError) as e:
                logging.error(f"尝试 {attempt} 失败: {e}")
                if attempt == self.max_retries:
                    raise InvalidInputError(data) from e
                continue
            except Exception as e:
                logging.critical(f"未知错误: {e}")
                raise

# 使用示例
processor = DataProcessor()
try:
    result = processor.process("123.45")
    print(f"处理结果: {result}")
except InvalidInputError as e:
    print(f"处理失败: {e}")

案例2:自动化测试框架

import unittest
from unittest.mock import patch

class TestUserService(unittest.TestCase):
    @patch('user_service.Database')  # 模拟数据库
    def test_user_creation(self, mock_db):
        # 设置模拟返回值
        mock_db.return_value.insert.return_value = 1001
        
        from user_service import create_user
        user_id = create_user("test@example.com", "password123")
        
        # 验证结果
        self.assertEqual(user_id, 1001)
        mock_db.return_value.insert.assert_called_once_with(
            "users", {"email": "test@example.com", "password": "password123"}
        )

    def test_invalid_email(self):
        from user_service import create_user
        with self.assertRaises(ValueError):
            create_user("invalid-email", "password")

if __name__ == "__main__":
    unittest.main()

10.9 学习路线图

10.10 学习总结

  1. 核心要点
  2. 掌握try-except-finally完整结构
  3. 理解异常类继承体系
  4. 熟练使用调试工具
  5. 能够编写单元测试
  6. 实践建议
  7. 异常处理要具体化(避免裸except)
  8. 使用logging替代print调试
  9. 重要操作添加断言检查
  10. 为关键功能编写测试用例
  11. 进阶方向
  12. 异常链与上下文管理
  13. 异步代码调试
  14. 性能优化分析
  15. 测试覆盖率分析
  16. 常见陷阱
  17. 过度捕获异常掩盖问题
  18. 忘记处理finally中的异常
  19. 测试用例不够独立
  20. 调试后遗留的调试代码

持续更新Python编程学习日志与技巧,敬请关注!


#编程# #python# #在头条记录我的2025#


相关推荐

python学习教程-第七节内容

函数(重点)基本概念Python函数的语法是编程中的核心概念之一,它允许你将代码块封装为可重复调用的单元。基本语法定义函数:示例参数类型位置参数(PositionalArguments)按参数定义...

Python排序90%人只会用sorted()?这7个高阶技巧让你代码效率翻倍

高效处理数据的关键,往往从掌握排序开始。排序操作在Python编程中的重要性常被低估——直到你面对一个杂乱无章的数据集。作为数据处理的核心操作之一,排序效率直接决定了程序性能和代码可读性。无论你正在清...

第四章:Python函数

4.1函数的定义与调用4.1.1理论知识函数是组织好的、可重复使用的代码块,用于执行特定的任务。它可以提高代码的复用性和可维护性。在Python中,定义函数使用def关键字,其基本语法如下:def...

ArcGIS 一个独立运行的Python程序编写和打包

写代码#coding=utf8#-*-coding:UTF-8-*-importarcpyfromarcpyimportenvimportosimportsys##########...

python入门到脱坑经典案例—计算三角形的面积

下面为大家详细讲解如何用Python计算三角形面积。我们会从最基础的数学公式开始,逐步深入编程实现,并涵盖多个实用版本。以下是完整的教学指南:1.数学原理回顾三角形面积公式:面积=(底边长度...

Python运算技巧:10种计算列表平方的高效方法

1.使用for循环此方法遍历列表中的每个数字,使用**运算符计算其平方,然后将结果添加到新的列表中。2.使用列表推导式此方法使用列表推导式,这是一种更简洁的方式,可以在现有列表的每个项目上执行操作...

墙裂推荐,5个学习Python编程最佳的开源库

学习Python少不了的就是项目,我在GitHUB上找了几个比较好的开源库,大家可以跟着去学习。1、learn-python3这个存储库一共有19本Jupyter笔记本。它涵盖了字符串和条件之类的基础...

使用Python玩转ftplib库:实现ftp文件传输自动化全攻略

大家好!在日常工作中都会使用到ftp功能,用于上传和下载文件等,本章主要介绍Python的标准库ftplib来实现FTP文件传输,帮助我们实现ftp自动化。一、ftplib库核心函数速查表1连接与登...

Python零基础入门学习23:常用第三方库之图像处理库Pillow

注:本文所有代码均经过Python3.7实际运行检验,保证其严谨性。本文约2000字,阅读时间约为4分钟。Pillow库的概述Pillow库是Python最好的图像处理库,可能是使用频率最高的图像处...

Python编程之BeautifulSoup库

#头条创作挑战赛#BeautifulSoup是一个可以从HTML或XML文件中快速提取数据的Python库。它能够通过转从入门到精通Python网络爬虫框架Scrapy38换器实...

Python3 新一代Http请求库Httpx使用(详情版)

我们经常使用Python语言的朋友们都清楚,requests是使用率非常高的HTTP库,甚至更早Python2中使用的是urllib、urllib2,也给我们提供了许多方便的功能。但是自从...

小白也可以玩的Python爬虫库,收藏一下

最近,微软开源了一个项目叫「playwright-python」,作为一个兴起项目,出现后受到了大家热烈的欢迎,那它到底是什么样的存在呢?今天为你介绍一下这个传说中的小白神器。Playwright是...

apscheduler,一个超厉害的 Python 库!

大家好,今天为大家分享一个超厉害的Python库-apscheduler。Github地址:https://github.com/agronholm/apschedulerAPSchedule...

给3D Slicer添加Python第三方插件库

对临床医生或医学影像算法研究人员来说,3DSlicer是不错的临床实践或科研工具。随着人工智能和深度学习技术的普及,python已经作为原型开发和验证的计算机编程语言。3DSlicer自带pyt...

Paramiko:一个非常实用的Python库

前言Python的Paramiko库,它是一个用于实现SSHv2协议的客户端和服务器的库。通过使用Paramiko,我们可以在Python程序中轻松地实现远程服务器的管理、文件传输等功能。特别做智能硬...