🌱句法错误
句法错误又称为解析错误,是学习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="")