当前位置: 首页 > news >正文

十二、错误 和 异常

一、异常介绍

Python 是一门解释型语言,只有在程序运行后才会执行语法检查。所以,只有在运行或测试程序时,才会真正知道该程序能不能正常运行。

Python 有两种错误很容易辨认:语法错误和异常。

1.1、语法错误

程序解析时遇到的错误。

例如以下程序,因缺少 : 而出现语法错误。

while True print(1)
#     while True print(1)
#                ^^^^^
# SyntaxError: invalid syntax

1.2、异常

Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

例如以下程序,因变量名未找到而引发 NameError

print(var1)
#    print(var1)
#    ^^^^
# NameError: name 'var1' is not defined. Did you mean: 'vars'?

大多数的异常都不会被程序处理,都以错误信息的形式打印出来,错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。



二、异常处理

对异常进行处理并不是将错误规避了,而是当程序运行的时候,出现错误的时候提供解决方案,不终止程序,可以让程序继续执行。

2.1、try except

可以使用 try except 语句来捕获异常并处理。

2.1.1、语法
try:可能发生异常的代码except:异常处理的代码# 如果没有发生异常,程序会忽略 except 中的代码,继续向下执行。# 如果发生了异常,会忽略 try 中剩余代码,执行 except 中的代码。
2.1.2、案例
try:result = 3 / 1print("没有发生异常")except:print("发生异常了")print("End")

2.2、捕获指定类型的异常以及获取异常描述信息

在打印出来的异常信息中,冒号之前是异常类型,冒号之后是异常描述信息。

# NameError: name 'a' is not defined
# NameError: 冒号之前是异常类型
# : name 'a' is not defined 冒号之后是异常描述信息

如果出现的异常不是我们指定的类型中的其中一个,我们在程序中想对不同类型的异常进行不同的处理,并在处理异常的时候,要获取异常信息,我们可以通过如下方式。

2.2.1、语法
try:可能发生异常的代码except 异常类型1 as 变量名1:异常处理的代码except 异常类型2 as 变量名2:异常处理的代码except (异常类型3, 异常类型4, 异常类型5) as 变量名3:异常处理的代码except:异常处理的代码
  • 如果没有发生异常,程序会忽略 except 中的代码,继续向下执行。

  • 如果发生了异常,会忽略 try 中剩余代码,根据异常类型匹配到相应的 except 并执行其中的代码。

  • 如果发生了异常,且异常类型无法和任何 except 匹配,异常将向外传递。

  • 一个 except 可以同时处理多个异常,将这些异常放在一个元组中。

  • 最后一个 except 可以忽略异常类型,它将被作为通配符使用。

2.2.2、案例
try:result = 3 / 0print("发生异常了")except ZeroDivisionError as e:print(e)except (RuntimeError, TypeError, NameError) as e:print(e)except:print("发生了其他异常")

2.3、else

可选地将 else 放在所有 except 之后。如果 try 中代码没有发生异常,将执行 else 中的代码。

2.3.1、语法
try:# 可能发生异常的代码except 异常类型1 as 变量名1:# 异常处理的代码except 异常类型2 as 变量名2:# 异常处理的代码else:# 没有异常时执行的代码
2.3.2、说明
  • 从执行效果上说,将代码放到 else 块和直接放到 try 块中是一样的。

  • 将 try 正常执行完毕而没有引发任何异常后被执行的代码放到 else 中。提供了一种清晰的逻辑区分,将正常情况的代码与异常处理代码分开,使代码更易于理解和维护,有助于代码的可读性和可维护性。

  • 例如,你希望在 try 块中有些操作执行成功后,再执行其它代码,那就可以把代码放到 else 语句块中。

2.3.2、案例
try:result = x / yexcept ZeroDivisionError:print("除数不能为零!")else:print(f"结果是:{result}")

2.4、finally

可选地,放在最后。无论是否发生异常都会执行的代码,通常用于执行一些必须要进行的清理操作,例如关闭文件、释放资源(如网络连接、数据库连接、锁等),即使在执行 try 块中的代码时出现了异常,也能保证这些操作得以完成。

2.4.1、语法
try:# 可能发生异常的代码except 异常类型1 as 变量名1:# 异常处理的代码except 异常类型2 as 变量名2:# 异常处理的代码else:# 没有异常时执行的代码finally:# 无论是否发生异常都会执行的代码
2.4.2、说明
  • 如果从执行效果上说,大部分场景,将代码放到 finally 语句和放到 try-except 块外效果是一样的。

  • finally 语句是 try-except 结构的一部分,它确保了无论 try 块中是否发生异常,无论 except 块是否被执行,其中的代码都会被执行。

  • 直接放在 try-except 结构外面的代码只会在 try-except 结构正常执行完毕后才会执行,如果在 try 块中出现异常且没有被 except 块捕获,或者在 except 块中出现了新的异常导致程序终止,那么这部分代码将不会被执行。

2.4.3、案例
# try:
#     result = 3 / 0
# except ZeroDivisionError as e:
#     print(e)
# else:
#     print(result)
# finally:
#     print("finally")
# print("End")
#输出结果:
# division by zero
# finally
# Endtry:
    result = 3 / 0except NameError as e:
    print(e)else:
    print(result)finally:
    print("finally")print("End")#输出结果:
# finally
# Traceback (most recent call last):
#   File "e:\Hello\hello.py", line 15, in <module>
#     result = 3 / 0
#              ~~^~~
# ZeroDivisionError: division by zero
http://www.jsqmd.com/news/1354863/

相关文章:

  • SEIRS+常见问题解答:新手必知的15个关键知识点
  • 文档处理技能架构:从技术挑战到工程化解决方案
  • 解决90%的常见问题:Blender VS Code故障排除与日志分析指南
  • 如何优雅地解决微信公众号订阅难题:wewe-rss完整指南
  • mlx-lm实战:用Python轻松调用XORTRON.CriminalComputing.LARGE.2026.3-mlx-6Bit生成高质量文本
  • Flipper Zero无线安全分析实战指南:从车库门到智能家居的全面防护策略
  • 【Bug已解决】`transformers.image_transforms.resize` doesnot work for negative values 解决方案
  • 抖掌柜实操|从零做抖音无货源小店,一键铺货、多店互搬、AI违规检测全套玩法深度拆解 - 抖掌柜—键铺货
  • Laravel Prompts核心功能全解析:10种表单组件让你的CLI应用脱颖而出
  • 社交媒体自动化上传终极指南:一键分发内容到8大平台
  • 如何在WebGL项目中高效集成Live2D动态角色:Pixi-Live2D实战指南
  • ComfyUI-Frame-Interpolation:12种算法一站式解决视频帧插值难题
  • ZotMoov终极指南:5步实现Zotero文献附件自动化管理
  • GitHub ReadME Terminal核心功能详解:从安装到自定义的完整教程
  • 基于FPGA的图像形态学膨胀处理Verilog开发与开发板硬件测试
  • WorkBuddy自动化任务教程:解放双手,让AI帮你处理重复工作
  • Unity射线检测Physics.Raycast详解:从原理到实战的3D物体点击交互指南
  • Ookii.Dialogs.WinForms常见问题解答:新手必看
  • 告别WebRTC臃肿依赖:libdatachannel如何用500KB代码重塑实时通信生态
  • 抖掌柜AI电商实操|抖音小店一键铺货+多店互搬+智能选品+违规检测完整运营流程,新手无货源店群避坑干货 - 抖掌柜—键铺货
  • 【Bug已解决】Loading repository after rename does not work (with old name) 解决方案
  • ComfyUI-Frame-Interpolation终极指南:5分钟实现专业级视频流畅度提升
  • Godot插件生态全解析:从安装管理到实战开发指南
  • 实战指南:用Stride引擎地形系统打造次世代开放世界
  • 央企程序员转型AI创业:技术选型与商业实践
  • 抖掌柜|2026抖音无货源店群运营技巧 一键铺货多店互搬AI违规检测完整合规落地方案 - 抖掌柜—键铺货
  • 红黑树插入后哪里失衡:三种修复路径逐层展开
  • TencentDB Agent Memory身份认证:确保只有授权用户访问敏感记忆数据
  • 如何在3分钟内完成专业级音频转录?Buzz本地AI工具终极指南
  • 5分钟掌握群晖NAS硬盘兼容性破解:让任何硬盘都能完美工作