首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 10章 编写高效的函数
10.1 函数名
10.2 函数大小的权衡
10.3 函数的形参和实参
10.3.1 默认参数
10.3.2 使用*和**向函数传参
10.3.3 使用*创建可变参数函数
10.3.4 使用**创建可变参数函数
10.3.5 使用*和**创建包装函数
10.4 函数式编程
10.4.1 副作用
10.4.2 高阶函数
10.4.3 lambda 函数
10.4.4 在列表推导式中进行映射和过滤
10.5 返回值的数据类型应该不变
10.6 抛出异常和返回错误码
第 11章 注释、文档字符串和类型提示
11.1 注释
11.1.1 注释风格
11.1.2 内联注释
11.1.3 说明性的注释
11.1.4 总结性的注释
11.1.5 “经验之谈”的注释
11.1.6 法律注释
11.1.7 注释的专业性
11.1.8 代码标签和TODO 注释
11.1.9 神奇的注释和源文件编码
11.2 文档字符串
11.3 类型提示
11.3.1 使用静态分析器
11.3.2 为多种类型设置类型提示
11.3.3 为列表、字典等设置类型提示
11.3.4 通过注释向后移植类型提示
第 12章 通过Git管理项目
12.1 Git 提交和仓库
12.2 使用Cookiecutter新建Python项目
12.3 安装Git
12.3.1 配置Git 用户名和电子邮件
12.3.2 安装GUI Git 工具
12.4 Git 的工作流程
12.4.1 Git 是如何追踪文件状态的
12.4.2 为什么要暂存文件
12.5 在计算机上创建Git 仓库
12.5.1 添加供Git 追踪的文件
12.5.2 忽略仓库中的文件
12.5.3 提交修改
12.5.4 从仓库中删除文件
12.5.5 重命名和移动仓库中的文件
12.6 查看提交日志
12.7 恢复历史修改
12.7.1 撤销未提交的本地修改
12.7.2 取消暂存的文件
12.7.3 回滚近期的提交
12.7.4 回滚到单个文件的某次提交
12.7.5 重写提交历史
12.8 GitHub 和git推送命令
12.8.1 将一个已存在的仓库推送到GitHub
12.8.2 克隆已存在的GitHub仓库
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(四)
小册名称:Python编程轻松进阶(四)
### 10.6 抛出异常和返回错误码 在Python编程中,错误处理是确保程序健壮性和用户友好性的重要环节。当程序遇到无法继续执行的情况时,如何优雅地通知调用者或用户发生了什么问题,是每位开发者都需要掌握的技能。在这一章节中,我们将深入探讨Python中两种主要的错误处理机制:抛出异常(Raising Exceptions)和返回错误码(Returning Error Codes),并比较它们在不同场景下的适用性。 #### 10.6.1 抛出异常 异常(Exception)是Python中用于处理运行时错误的一种机制。当Python解释器遇到无法处理的状况时,它会停止当前代码的执行,并抛出一个异常。开发者可以捕获这个异常,并根据需要进行处理,比如给用户一个友好的错误提示,或者尝试执行一些恢复措施。 ##### 1. 异常的基础 在Python中,几乎所有的异常都是`BaseException`类的子类,而`Exception`是`BaseException`的直接子类,大多数由程序错误引起的异常都是`Exception`的子类。常见的异常包括`ValueError`、`TypeError`、`KeyError`等。 要抛出一个异常,可以使用`raise`语句,后跟一个异常实例或异常类(在这种情况下,Python会自动创建该类的实例,但不带任何参数)。 ```python def divide(x, y): if y == 0: raise ValueError("除数不能为0") return x / y try: result = divide(10, 0) except ValueError as e: print(f"发生错误:{e}") ``` ##### 2. 自定义异常 除了使用Python内置的异常,开发者还可以根据需要定义自己的异常类。自定义异常类通常继承自`Exception`或其子类。 ```python class MyCustomError(Exception): """自定义异常类""" def __init__(self, message="这是一个自定义错误"): self.message = message super().__init__(self.message) try: raise MyCustomError("发生了某个特定的错误") except MyCustomError as e: print(f"捕获到自定义错误:{e}") ``` ##### 3. 异常链 在某些情况下,一个异常可能是由另一个异常触发的。为了保留原始异常的上下文,可以在抛出新异常时,将原始异常作为参数传递给新异常。Python通过`from`关键字支持这种异常链。 ```python try: # 假设这里有一段复杂的代码,可能引发多种异常 raise ValueError("内部错误") except ValueError as e: # 抛出新的异常,同时保留原异常的上下文 raise RuntimeError("处理内部错误时发生问题") from e ``` #### 10.6.2 返回错误码 在某些编程语言或特定场景下,返回错误码是处理错误的另一种常见方式。不同于抛出异常,返回错误码通常意味着函数或方法在执行过程中遇到了问题,但它选择通过返回值而不是中断程序流程来报告这个问题。 ##### 1. 错误码的设计 设计一套合理的错误码系统需要考虑到错误码的唯一性、可读性以及可扩展性。通常,错误码可以是整数、枚举类型或自定义对象,每个错误码对应一种特定的错误情况。 ```python from enum import Enum class ErrorCode(Enum): SUCCESS = 0 INVALID_PARAMETER = 1 NOT_FOUND = 2 # ... 其他错误码 def find_user(user_id): # 假设这里有一个查找用户的操作 if not user_id: return ErrorCode.INVALID_PARAMETER, None # ... 查找逻辑 if not found: return ErrorCode.NOT_FOUND, None return ErrorCode.SUCCESS, user_info result_code, user = find_user(None) if result_code != ErrorCode.SUCCESS: print(f"错误:{result_code.name}") ``` ##### 2. 优缺点分析 **优点**: - **性能**:在某些情况下,返回错误码可能比抛出异常有更好的性能,因为异常处理机制可能会带来额外的开销。 - **兼容性**:与某些旧系统或库的接口兼容时,可能需要返回错误码而不是抛出异常。 **缺点**: - **可读性**:错误码可能不如异常消息直观,需要额外的文档或枚举定义来理解每个错误码的含义。 - **控制流**:使用错误码可能需要更多的条件判断来控制程序的流程,这可能会使代码变得更加复杂和难以维护。 #### 10.6.3 抛出异常与返回错误码的选择 选择抛出异常还是返回错误码,取决于具体的应用场景和团队的开发习惯。一般来说,如果错误情况会导致程序无法继续正常执行,或者需要立即通知调用者注意,那么抛出异常是更好的选择。如果错误情况只是表示一个可预期的结果(如数据未找到),并且调用者可以根据这个结果采取进一步的行动,那么返回错误码可能更合适。 在Python社区中,抛出异常是更受推崇的错误处理方式,因为它能够更清晰地表达错误的发生,并且Python的异常处理机制非常强大和灵活。然而,在某些特定的场景下,比如需要与旧系统交互或满足特定的性能要求时,返回错误码也是可行的选择。 总之,无论是抛出异常还是返回错误码,关键在于选择一种能够清晰、有效地表达错误情况,并且易于理解和维护的错误处理方式。
上一篇:
10.5 返回值的数据类型应该不变
下一篇:
第 11章 注释、文档字符串和类型提示
该分类下的相关小册推荐:
Python数据分析与挖掘实战(上)
Python与办公-玩转PPT
Python神经网络入门与实践
Python3网络爬虫开发实战(上)
Python爬虫入门与实战开发(下)
Python合辑7-集合、列表与元组
Python编程轻松进阶(五)
Python合辑5-格式化字符串
Python机器学习基础教程(下)
Python面试指南
Python合辑9-判断和循环
Python合辑12-面向对象