百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python的错误和异常

off999 2024-11-19 08:35 40 浏览 0 评论

如果您输入过本教程前文的例子,应该已经看到过一些错误信息。目前,(至少)有两种不同错误:句法错误和异常。

1.句法错误

句法错误又称解析错误,是学习 Python 时最常见的错误:

解析器会复现出现句法错误的代码行,并用小“箭头”指向行里检测到的第一个错误。错误是由箭头 上方 的 token 触发的(至少是在这里检测出的):本例中,在 print() 函数中检测到错误,因为,在它前面缺少冒号(':') 。错误信息还输出文件名与行号,在使用脚本文件时,就可以知道去哪里查错。

2.异常

即使语句或表达式使用了正确的语法,执行时仍可能触发错误。执行时检测到的错误称为 异常,异常不一定导致严重的后果:很快我们就能学会如何处理 Python 的异常。大多数异常不会被程序处理,而是显示下列错误信息:

错误信息的最后一行说明程序遇到了什么类型的错误。异常有不同的类型,而类型名称会作为错误信息的一部分中打印出来:上述示例中的异常类型依次是:ZeroDivisionError, NameError 和 TypeError。作为异常类型打印的字符串是发生的内置异常的名称。对于所有内置异常都是如此,但对于用户定义的异常则不一定如此(虽然这种规范很有用)。标准的异常类型是内置的标识符(不是保留关键字)。

此行其余部分根据异常类型,结合出错原因,说明错误细节。

错误信息开头用堆栈回溯形式展示发生异常的语境。一般会列出源代码行的堆栈回溯;但不会显示从标准输入读取的行。

内置异常 列出了内置异常及其含义。

3.异常的处理

可以编写程序处理选定的异常。下例会要求用户一直输入内容,直到输入有效的整数,但允许用户中断程序(使用 Control-C 或操作系统支持的其他操作);注意,用户中断程序会触发 KeyboardInterrupt 异常。

try 语句的工作原理如下:

  • 首先,执行 try 子句 (try 和 except 关键字之间的(多行)语句)。
  • 如果没有触发异常,则跳过 except 子句,try 语句执行完毕。
  • 如果在执行 try 子句时发生了异常,则跳过该子句中剩下的部分。 如果异常的类型与 except 关键字后指定的异常相匹配,则会执行 except 子句,然后跳到 try/except 代码块之后继续执行。
  • 如果发生的异常与 except 子句 中指定的异常不匹配,则它会被传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常 且执行将终止并输出如上所示的消息。

try 语句可以有多个 except 子句 来为不同的异常指定处理程序。 但最多只有一个处理程序会被执行。 处理程序只处理对应的 try 子句 中发生的异常,而不处理同一 try 语句内其他处理程序中的异常。 except 子句 可以用带圆括号的元组来指定多个异常,例如:

... except (RuntimeError, TypeError, NameError):
...     pass

如果发生的异常与 except 子句中的类是同一个类或是它的基类时,则该类与该异常相兼容(反之则不成立 --- 列出派生类的 except 子句 与基类不兼容)。 例如,下面的代码将依次打印 B, C, D:

请注意如果颠倒 except 子句 的顺序(把 except B 放在最前),则会输出 B, B, B --- 即触发了第一个匹配的 except 子句

所有异常都继承自 BaseException,因此它可被用作通配符。 但这种用法要非常谨慎小心,因为它很容易掩盖真正的编程错误! 它还可被用于打印错误消息然后重新引发异常(允许调用者再来处理该异常):

使用 else 子句比向 try 子句添加额外的代码要好,可以避免意外捕获非 try ... except 语句保护的代码触发的异常。

发生异常时,它可能具有关联值,即异常 参数 。是否需要参数,以及参数的类型取决于异常的类型。

except 子句 可以在异常名称后面指定一个变量。 这个变量会绑定到一个异常实例并将参数存储在 instance.args 中。 为了方便起见,该异常实例定义了 __str__() 以便能直接打印参数而无需引用 .args。 也可以在引发异常之前先实例化一个异常并根据需要向其添加任何属性。:

如果异常有参数,则它们将作为未处理异常的消息的最后一部分('详细信息')打印。

异常处理程序不仅会处理在 try 子句 中发生的异常,还会处理在 try 子句 中调用(包括间接调用)的函数。 例如:

4.触发异常

raise 语句支持强制触发指定的异常。例如:

raise 唯一的参数就是要触发的异常这个参数必须是异常实例或异常类(派生自 Exception 类)。如果传递的是异常类,将通过调用没有参数的构造函数来隐式实例化:

如果只想判断是否触发了异常,但并不打算处理该异常,则可以使用更简单的 raise 语句重新触发异常:

5.异常链

raise 语句支持可选的 from 子句,该子句用于启用链式异常。 例如:

转换异常时,这种方式很有用。例如:

异常链会在 except 或 finally 子句内部引发异常时自动生成。 这可以通过使用 from None 这样的写法来禁用:

6.用户自定义异常

程序可以通过创建新的异常类命名自己的异常(Python 类的内容详见 类)。不论是以直接还是间接的方式,异常都应从 Exception 类派生。

大多数异常命名都以 “Error” 结尾,类似标准异常的命名。

许多标准模块都需要自定义异常,以报告由其定义的函数中出现的错误。有关类的说明,详见 类。

7.定义清理操作

try 语句还有一个可选子句,用于定义在所有情况下都必须要执行的清理操作。例如:

如果存在 finally 子句,则 finally 子句是 try 语句结束前执行的最后一项任务。不论 try 语句是否触发异常,都会执行 finally 子句。以下内容介绍了几种比较复杂的触发异常情景:

  • 如果执行 try 子句期间触发了某个异常,则某个 except 子句应处理该异常。如果该异常没有 except 子句处理,在 finally 子句执行后会被重新触发。
  • except 或 else 子句执行期间也会触发异常。 同样,该异常会在 finally 子句执行之后被重新触发。
  • 如果 finally 子句中包含 break、continue 或 return 等语句,异常将不会被重新引发。
  • 如果执行 try 语句时遇到 break,、continue 或 return 语句,则 finally 子句在执行 break、continue 或 return 语句之前执行。
  • 如果 finally 子句中包含 return 语句,则返回值来自 finally 子句的某个 return 语句的返回值,而不是来自 try 子句的 return 语句的返回值。
    例如:

这是一个比较复杂的例子:

如上所示,任何情况下都会执行 finally 子句。except 子句不处理两个字符串相除触发的 TypeError,因此会在 finally 子句执行后被重新触发。

在实际应用程序中,finally 子句对于释放外部资源(例如文件或者网络连接)非常有用,无论是否成功使用资源。

8.预定义的清理操作

某些对象定义了不需要该对象时要执行的标准清理操作。无论使用该对象的操作是否成功,都会执行清理操作。比如,下例要打开一个文件,并输出文件内容:

这个代码的问题在于,执行完代码后,文件在一段不确定的时间内处于打开状态。在简单脚本中这没有问题,但对于较大的应用程序来说可能会出问题。with 语句支持以及时、正确的清理的方式使用文件对象:

语句执行完毕后,即使在处理行时遇到问题,都会关闭文件 f。和文件一样,支持预定义清理操作的对象会在文档中指出这一点。

相关推荐

win7系统激活状态不可用(win7windows激活状态不可用)

未激活的系统很多应用程序都没办法使用的,所以用激活工具激活系统。接下来小编分享win7用激活工具激活不了系统原因和解决方法。解决方法:1、已经激活了,但是有的网友是出现了黑色壁才进行的激活。激活后桌...

win7怎么设置不休眠(win7系统设置不休眠)

您可以按照以下步骤取消Windows7系统的休眠功能:1.点击“开始”菜单,选择“控制面板”。2.在控制面板中,选择“硬件和声音”。3.在“硬件和声音”中,选择“电源选项”。4.在“电源选项...

win7重装系统后键盘鼠标没反应

方法一:使用安全模式来解决1.首先我们尝试重启电脑,按关机键几款重启,如果重启电脑没有效果的话,将电脑鼠标的接头重新换一个USB接头即可。2.接着再开机按F8键(这时键盘肯定能用),再到高级启动选项下...

4g网速最快的apn接入点(4g哪个接入点快)

中国联通网速最快最稳的APN是3gnet。联通4G卡APN接入点应该选择“3gnet”,具体设置步骤如下:1、以MIUI系统为例,点击桌面上的“设置”应用图标;2、在打开的设置应用界面中,选择“双卡和...

支付宝注册(支付宝注册地址)
  • 支付宝注册(支付宝注册地址)
  • 支付宝注册(支付宝注册地址)
  • 支付宝注册(支付宝注册地址)
  • 支付宝注册(支付宝注册地址)
linux软件大全(linux相关软件)

Airtime-Airtime是一款用于调度和远程站点管理的开放广播软件Ardour-在Linux上录音,编辑,和混音Audacious-开源音频播放器,按你想要的方式播放你的音乐,...

什么是网络交换机(什么是网络交换机的作用)

交换机(又名交换式集线器)作用与集线器大体相同,可以简单的理解为将一些机器连接起来组成一个局域网,而每台机器还能独享带宽。原理:MAC地址通常由网卡(NIC)决定,并且每个网卡、交换机和路由器的每个端...

wifi热点精灵下载(下载wifi精灵怎么样)

启动你好,解决方法一这是网卡IP的设置问题,看下上网的那个网卡有没有“共享”或者看下网络连接列表里有没有“已共享”字样,取消共享:电脑右下角右击“打开网络和共享中心”-----点击“更改适配器”-...

win7游戏版系统(win7游戏专用版)

具体方法:1、进入win7桌面,右键单击桌面上的计算机图标,选择要打开的属性,然后进入下一步。2、点击系统属性界面左侧的“高级系统设置”进入下一步。3、切换到弹出系统属性界面的“高级”选项,点击性能选...

win7如何查看隐藏文件(win7打开隐藏的文件夹)
win7如何查看隐藏文件(win7打开隐藏的文件夹)

方法/步骤分步阅读1进入win7系统桌面,鼠标双击打开我的电脑。2在我的电脑上方的导航条中点击工具选项。3在出现的下拉框中选择‘文件夹选项’进入。4在出现的文件夹选项界面中切换到‘查看’选项。5拉动下方的滚动条,找到‘隐藏受保护的操作系统文...

2025-11-29 05:51 off999

电脑怎样设置自动关机(笔记本电脑怎样设置自动关机)

电脑如何设置定时关机,方法1.点击电脑屏幕左下角的开始按钮,在所有程序里依次选择选择附件---系统工具,然后单击打开任务计划程序。2.点击打开任务计划程序后,在最右边的操作框里选择创建基本任务,然后在...

最近最新电影网(最新的电影资讯)

目前有许多观看最新电影的网站可供选择。其中一些知名的网站包括Netflix、AmazonPrimeVideo、Hulu、Disney+、AppleTV+和HBOMax。这些网站提供了广泛的电影...

h3c网络管理软件(h3c 网管)

1.可能无法登录2.H3C无法登录的原因可能是网络连接问题、账号密码错误、软件版本不兼容等。网络连接问题可能是由于网络故障、设备配置错误等导致无法正常登录。账号密码错误可能是输入错误或者账号被锁定...

qq轻聊版官网首页(qq轻聊版2019最新下载正版)
qq轻聊版官网首页(qq轻聊版2019最新下载正版)

qq是一款功能十分强大的软件,身边很多的朋友都在使用,但是还是有一些新手朋友对于这个软件不是非常的了解,今天就聊一聊关于qq轻聊版和qq有什么区别的问题,希望可以帮助到有需要的朋友。第一,轻聊版不带捆绑软件,轻聊版QQ主界面功能部分消失,看...

2025-11-29 03:51 off999

能破译wifi密码的软件(真正能破解wifi密码的手机软件)
  • 能破译wifi密码的软件(真正能破解wifi密码的手机软件)
  • 能破译wifi密码的软件(真正能破解wifi密码的手机软件)
  • 能破译wifi密码的软件(真正能破解wifi密码的手机软件)
  • 能破译wifi密码的软件(真正能破解wifi密码的手机软件)

取消回复欢迎 发表评论: