CodeGym /课程 /Python SELF ZH /程序运行时的错误

程序运行时的错误

Python SELF ZH
第 17 级 , 课程 0
可用

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_bfunc_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的建议:

  1. 自底向上阅读: 从traceback中最低的调用开始分析,因为这是异常发生的地方。
  2. 检查所有调用: 查看traceback中的所有调用以理解错误的传播路径。
  3. 修正代码: 利用traceback中的信息修正代码,避免未来发生类似错误。

在接下来的讲座中,您将详细了解异常。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION