视频链接:

不如语冰

https://space.bilibili.com/70431433?spm_id_from=333.1007.0.0

文章代码链接:

https://github.com/zyf-ngu/Qmatter

6.try和except

在Python中,try、except 和 finally 是异常处理机制的关键组成部分。

它们的基本功能原理是:尝试执行一段代码(try块),如果这段代码中发生了异常,则根据异常类型执行相应的处理代码(except块),最后无论是否发生异常,都会执行清理代码(finally块)。

基本组成结构:

1. try块:包含可能引发异常的代码。

try:

risky_operation()

2. except块:一个或多个,用于捕获并处理特定类型的异常。可以指定异常类型,也可以不指定(捕获所有异常)。永远不要使用空的 except:(它会捕获包括 KeyboardInterrupt 的所有异常),至少应记录异常:

except ExceptionType1:

# 处理特定异常类型

handle_exception1()

except ExceptionType2 as e:

# 处理另一种异常(可获取异常对象)

handle_exception2(e)

except:

# 捕获所有未处理的异常(不推荐常规使用)

handle_unknown()

3. else块(可选):当`try`块中的代码没有引发异常时执行。

else:

# 当没有异常发生时执行(可选)

  safe_operation()

4. finally块:无论是否发生异常,都会执行的代码块。常用于资源清理(如关闭文件、释放锁等)。

finally:

    # 无论是否发生异常都会执行

    cleanup_resources()

再举个常用的文件读取的例子:

file = None

try:

    file = open('data.txt', 'r')

    content = file.read()

    print(content)

except FileNotFoundError:

    print("文件不存在!")

finally:

    if file:  # 检查文件对象是否存在

        file.close()  # 确保文件总是关闭

        print("文件已安全关闭")

try-except 块的变量作用域问题

Try和except代码块的变量是否通用?在 Python 中,try 和 except 块共享相同的作用域,就像它们属于同一个代码块一样。这意味着:两块变量通用的,在 try 块中创建的变量可以在 except 块中访问;在 except 块中创建的变量可以在 try 块之后使用;但如果 try 块中途发生异常,except块及后面模块变量可能处于未定义状态

关键注意事项

try:

    x = 10  # 定义在 try 块中

y = 5 / 0  # 这里会引发异常

except ZeroDivisionError:

    print(x)  # 可以访问 x(因为异常发生在赋值之后)

    # print(y)  # 错误!y 未定义(因为赋值未完成)

    z = 20  # 在 except 块中定义新变量

print(z)  # 可以访问 z(值为 20)

最佳实践

推荐:在 try 之前初始化可能需要的变量

result = None

try:

    data = load_data()  # 可能失败的操作

    result = process(data)  # 可能失败的后续操作except DataLoadError:

print("数据加载失败")

except ProcessingError:

    print("数据处理失败")

# 安全访问 result

if result is not None:

    use_result(result)

Traceback 问题排查溯源

有时候except捕获的异常比较笼统,不能精确确定出错的位置,这时可以使用traceback模块排查溯源。

常用的输出方法有traceback.print_exc() 与 traceback.format_exc() 。两者都是 traceback 模块中用于处理异常信息的函数,都用于获取当前异常的回溯信息,通常在 except 块中使用。核心区别是print_exc()无返回值,直接输出到命令行,也可以接受 file 参数指定输出位置;而format_exc()返回字符串形式的异常信息,不直接输出,需要print打印,没有参数。

import traceback

def function_a():

    return function_b()

def function_b():

    return function_c()

def function_c():

    # 这里会引发一个错误

    return 1 / 0  # 除零错误

# 普通异常处理 - 信息有限

try:

    function_a()

except Exception as e:

    print("普通异常处理:")

    print(f"异常类型: {type(e).__name__}")

    print(f"异常信息: {e}")

    print("-" * 50)

# 使用 traceback 获取详细信息

try:

    function_a()

except Exception as e:

    print("使用 traceback.print_exc 处理:")

    print("完整异常信息:")

    traceback.print_exc()  # 打印完整的异常跟踪信息

    print("-" * 50)

    # 获取异常信息作为字符串

    error_info = traceback.format_exc()

    print("使用traceback.print_exc输出 :")

    print(error_info)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐