AI大模型入门-Python进阶-try和except异常处理
视频链接:
不如语冰
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)
更多推荐




所有评论(0)