Python 错误和异常

本文详细介绍了Python中的句法错误和异常,包括如何处理和触发异常,使用try-except-finally语句进行异常管理,以及如何定义和使用用户自定义异常。此外,还讨论了预定义的清理操作,如with语句在文件操作中的应用。
摘要由CSDN通过智能技术生成

🌱句法错误

句法错误又称为解析错误,是学习Python时最创建的错误。

解析器会复现出现句法错误的代码行,并用小“箭头”指向行里检查到的第一个错误。

🌱异常

即使语句或表达式使用了正确的语法,执行时仍可能触发错误。执行时检查到的错误成为“异常”,异常不一定导致严重的后果。大多数异常不会被程序处理,而是显示错误信息。错误信息的最后一行说明程序遇到了什么类型的错误。异常有不同的类型,而类型名称会作为错误信息的一部分中打印出来。

🌱异常的处理

可以编写程序处理选定的异常。

try 语句的工作原理:

1.首先,执行try子句try和except关键字之间的(多行语句);

2.如果没有触发异常,则跳过except子句,try语句执行完毕;

3.如果在执行try子句时发生了异常,则跳过该子句剩下的部分。如果异常的类型与except关键字后制定的异常相匹配,则会执行execpt子句,然后跳出try/except代码块之后继续执行。

4.如果发生的异常与execpt子句中指定的异常不匹配,则它会被传递到外部的try语句中;如果没找到处理程序,则它是一个 为处理异常 且执行终止并输出错误信息。

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

except (RuntimeError, TypeError, NameError):
    pass

🌱触发异常

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

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

raise ValueError

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

🌱用户自定义异常

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

异常类可以被定义成能做其他类所能做的任何事,但通常应当保持简单,它往往只提供一些属性,允许相应的异常处理程序提取有关错误的信息。

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

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

🌱定义清理操作

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

try:
    raise KeyboardInterrupt   #此行为强制触发异常
finally:
    print("aa")

如果存在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语句的返回值。

🌱预定义的清理操作

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

for line in open("myfile.txt"):
    print(line,end="")

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

with open("myfile.txt") as f:
    for line in f:
        print(line,end="")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值