精通 Python 异常处理:try、except、finally 与 raise 高效用法
精通 Python 异常处理:try、except、finally 与 raise 高效用法
什么是 Python 异常处理?
异常是程序执行时发生的错误。运行程序时 Python 会生成异常,必须处理以避免程序崩溃。Python 中异常在错误时自动触发,也可由代码主动触发和拦截。
异常表明:虽然事件可能发生,但此类事件不常见。方法无法处理异常时,会抛给调用函数。最终异常抛出主函数外,程序突然终止。
本 Python 异常处理教程你将学到:
- 什么是 Python 异常?
- 常见异常示例
- 为什么要使用异常?
- 异常规则
- Python 异常处理机制
- Python Try 语句
- Python Catch 语句
- Python Raise 语句
- 重要 Python 错误
- 其他重要 Python 异常
- Error 与 Exceptions 区别
常见异常示例:
- 除零错误
- 访问不存在的文件
- 两不兼容类型相加
- 访问序列不存在的索引
- 从断开的数据库服务器移除表
- ATM 取款超可用金额
为什么要使用异常?
使用异常的理由:
- 异常处理让错误处理代码与正常代码分离。
- 异常是表示错误的 Python 对象。
- 如代码注释,异常提醒程序预期。
- 澄清代码、增强可读性。
- 在一处以统一方式处理错误后果。
- 异常是处理错误消息的便捷方法。
- Python 中可用 raise 抛出异常。
- 抛出异常可中断当前代码执行,将异常回溯直到被处理。
- 为无法直接处理的组件处理异常。
异常规则
Python 异常处理基本规则:
- 异常必须是类对象
- 类异常可用 try 语句配合 except 子句指定特定类
- 语句或表达式语法正确,执行时仍可能报错
- 执行时发现的错误称为异常,非无条件致命
Python 异常处理机制
异常处理由以下 5 个关键字管理:
- try
- except
- finally
- raise
Python Try 语句
try 语句包含关键字 try、冒号(:)和可能发生异常的代码套件。有一个或多个子句。
执行 try 语句时,若无异常则解释器忽略该 try 的异常处理器。
若 try 套件中发生异常,try 套件终止,程序控制转移到 try 套件后匹配的 except 处理器。
Syntax: try: statement(s)
Except 语句
Except 块一次接受一个参数,即它可能捕获的异常类型。参数范围从特定异常类型到捕获所有异常的通用类别。
Except 块规则:
- 用 except 关键字定义 except 块
- 异常参数始终用括号括起
- 始终表示 except 块处理的异常类型
- 异常处理代码写在两个 {} 花括号间
- 单个 try 块可放多个 except 块
- except 块只能在 try 块后
- 所有 except 块应按子类到超类异常顺序排列
示例:
try:
# 代码
except ArrayIndexOutOfBoundsException as e:
print("Caught first " + str(e))
except IOError as e:
print("Caught second " + str(e))
Finally 语句
Finally 块无论是否抛出异常都执行。final 关键字允许创建跟在 try-except 后的代码块。
Finally 子句可选。旨在定义所有条件下都应执行的清理动作。
try:
raise KeyboardInterrupt
finally:
print('welcome, world!')
# Output
Welcome, world!
KeyboardInterrupt
Finally 子句在 try 语句前执行。
Raise 语句
raise 语句指定初始化异常对象的参数。异常名后跟逗号,再跟参数或参数元组。
语法:
raise [Exception [, args [, traceback]]]
此语法中参数可选,执行时异常参数值总为 none。
示例:
Python 异常可以是字符串、类、数字或对象等任意值。Python 核心抛出的大多数异常是带参数的类,参数是类的实例。
重要 Python 错误
| 错误类型 | 描述 |
|---|---|
| ArithmeticError | 所有算术异常的基类。算术运算错误时抛出。 |
| ImportError | 尝试导入不存在的模块时抛出。模块名拼写错误或模块不在标准路径会发生此异常。 |
| IndexError | 引用序列超出范围时抛出。 |
| KeyError | 字典中找不到特定键时抛出。 |
| NameError | 代码引用的名称在局部或全局命名空间从未存在时抛出。 |
| ValueError | 函数或内置操作接收参数类型正确但值不合适时抛出。 |
| EOFError | 内置函数(input() 或 raw_input())到达 EOF 条件未读取任何数据时抛出。 |
| ZeroDivisionError | 所有数值类型进行除法或取模运算时除数为零抛出。 |
| IOError | 输入/输出操作失败时抛出。 |
| SyntaxError | Python 语法错误时抛出。 |
| IndentationError | 缩进未正确定义时抛出。 |
其他重要 Python 异常
| 异常 | 描述 |
|---|---|
| ArithmeticException | 算术错误,如除零。 |
| ArrayIndexOutOfBoundsException | 数组索引越界。 |
| ArrayStoreException | 赋值给不兼容类型的数组元素。 |
| ClassCastException | 无效转型 |
| IllegalMonitorStateException | 非法监视器操作,如在未锁定线程上等待。 |
| IllegalStateException | 环境或应用处于错误状态。 |
| ClassNotFoundException | 类未找到。 |
| CloneNotSupportedException | 尝试克隆未实现 Cloneable 接口的对象。 |
| IllegalAccessException | 拒绝访问类。 |
| InstantiationException | 尝试创建接口或抽象类对象时发生。 |
| CloneNotSupportedException | 尝试克隆未实现接口的对象。 |
Error 与 Exceptions
| Error | Exceptions |
|---|---|
| Python 所有错误均为未检查类型。 | 异常包含检查和未检查类型。 |
| 错误发生在运行时,编译器未知。 | 异常可通过 try-catch 块处理恢复。 |
| 错误多由应用运行环境引起。 | 应用自身引起异常。 |
| 示例: OutOfMemoryError | 示例: Checked Exceptions, SQL exception, NullPointerException 等。 |
总结
- 异常是程序执行期间发生的错误。
- 异常表明事件虽可能发生但不频繁。
- 常见异常:1) 除零 2) 访问不存在文件 3) 两不兼容类型相加。
- 异常是表示错误的 Python 对象。
- try 语句含 try 关键字、冒号和可能发生异常的代码套件,有一或多个子句。
- except 块一次接受一个参数,即可能捕获的异常类型。
- raise 语句指定初始化异常对象的参数。
- finally 块无论是否抛出异常都执行。
Python
- C++ 异常处理实战:try、catch、throw 完整指南与示例
- 精通Python数据类型:实战指南
- 精通Python运算符:全面指南
- 精通Python Pass语句:实战指南
- 精通Python函数参数:位置、关键字与默认参数
- 精通 Python 字典:创建、操作与进阶技巧
- 精通 Python 异常处理:try、except、else 与 finally 详解
- 精通 Python 迭代器:工作原理与自定义构建
- Python 闭包详解:嵌套函数如何捕获变量
- 精通 Python 异常处理:try、except、finally 与 raise 高效用法
- 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解
- 精通 Java 异常处理:try-catch-finally 与资源管理