1.1 错误的产生
错误(和异常)是编程中不可避免的一部分。 当程序遇到意外情况时,会出现这些问题,它们无法处理。在Python中有一个异常处理系统,可以拦截和处理错误,防止程序崩溃。
异常通常在以下情况下出现:
语法错误:
这些是在代码编译阶段检测到的错误,通常与Python语言的语法不当有关。例如,缺少冒号或错误的关键字。
if True:
print("Hello")
运行时错误 (Runtime Errors):
这些错误在程序运行时出现,可能由多种原因引起,比如除以零、访问不存在的列表索引、不正确使用数据类型等。
print(1 / 0) # ZeroDivisionError
逻辑错误:
这些错误发生在程序正常运行但由于程序逻辑错误导致结果不正确。逻辑错误不会抛出异常,并且更难调试。
逻辑错误通常被称为bug——它们是程序功能的某种瑕疵。而运行时的错误被称为异常。对于每种这样的错误,Python会创建一个特殊的对象(异常)并将其“抛出”到程序中...
1.2 异常的处理流程
当Python中出现异常时,它会沿着调用栈向上“抛出”直到被处理。调用栈表示导致异常发生的一系列函数调用。
异常提升机制
- 异常的发生: 当发生错误时,Python会创建一个异常对象。
- 寻找异常处理器: Python解释器开始在当前代码块中寻找异常处理器。如果没有找到,它会转向下一个调用当前函数的代码块。
- 沿调用栈提升异常: 这个过程会重复进行,直到找到处理器或者调用栈耗尽。
- 程序的结束: 如果没有找到处理器,程序将终止并输出错误信息。
示例:
def func_a():
func_b()
def func_b():
func_c()
def func_c():
print(1 / 0) # 这里发生ZeroDivisionError异常
func_a()
在这个示例中,异常ZeroDivisionError发生在函数func_c中,然后通过func_b和func_a沿着调用栈向上提升。 如果没有找到处理器,程序将以错误终止。
1.3 日志的读取
当程序由于未处理的异常结束时,Python会输出一个traceback,这有助于开发人员理解问题出在哪里。traceback包含了导致异常发生的函数调用顺序的信息,并可以被用来调试程序。
traceback示例
Traceback (most recent call last):
File "example.py", line 10, in
func_a() File "example.py", line 2, in func_a func_b() File "example.py", line 5, in func_b func_c() File "example.py", line 8, in func_c print(1 / 0) ZeroDivisionError: division by zero
traceback的分析
- 异常类型和消息: traceback的最后部分会标明异常类型和消息。在这个示例中是
ZeroDivisionError: division by zero. - 调用顺序: traceback展示了函数调用的顺序。在我们的示例中,错误发生在函数
func_c中的print(1 / 0)行,它是从func_b调用的,而func_b又是从func_a调用的。 - 文件和代码行: 每个traceback行中都指明了发生调用的文件和行号。这样可以快速找到并修复代码中的错误。
traceback的实际应用
traceback是调试和分析程序的重要工具。它帮助开发人员理解错误发生的原因,并找到代码中出错的地方。以下是一些使用traceback的建议:
- 自底向上阅读: 从traceback中最低的调用开始分析,因为这是异常发生的地方。
- 检查所有调用: 查看traceback中的所有调用以理解错误的传播路径。
- 修正代码: 利用traceback中的信息修正代码,避免未来发生类似错误。
在接下来的讲座中,您将详细了解异常。
GO TO FULL VERSION