在开发程序的时候,总会有各种问题难以预料,比如:文件未找到,文件格式不对,类型错误等等,经常会出现 "代码刚才还好好的","代码在我电脑上没有问题啊..." 等等问题,程序经常会遇到意想不到的错误。还好,python提供了一种机制,可以捕获这类错误并继续运行而不是直接报错或崩溃,这种机制就是异常处理。
Python中的try语句用于异常处理,确保程序在遇到错误时能够继续运行而不是崩溃。
我们可以看看一些经典的内置模块或第三方模块的源码,毫无疑问,几乎都在使用try语句,大佬之所以是大佬,是因为他们把可能会出现的代码问题都考虑到了,并提前对异常做处理。
基本语法和用法
try:
# 可能会引发异常的代码
except Exception1:
# 当捕获到 Exception1 时执行的代码
except Exception2:
# 当捕获到 Exception2 时执行的代码
else:
# 如果 try 块没有引发异常,则执行此处代码
finally:
# 无论是否引发异常,都会执行此处代码
异常处理机制
- 捕获特定异常:可以使用except子句来捕获特定类型的异常,例如ZeroDivisionError或ValueError。如果try块中的代码引发了这些异常,相应的except子句将被执行。
- 捕获所有异常:可以使用一个不带参数的except子句来捕获所有类型的异常。
try ... except
一个 try 语句可能有多个 except 子句,以指定不同异常的处理程序。 最多会执行一个处理程序。 处理程序只处理相应的 try 子句中发生的异常,而不处理同一 try 语句内其他处理程序中的异常
有些时候,我们无法完全预测产生异常的可能类型,而且对于不同的异常处理类型我们的处理逻辑都是一样的,这种情况下,可直接采用Exception进行处理(Exception也叫万能异常,即可以捕捉到由逻辑错误产生的任何异常),
a=[1,2,3,0]
try:
for i in a:
print(6/i)
except Excetion as e:
print(e)
try...except...else
try ... except 语句有一个可选的 else 子句,在使用时必须放在所有的 except 子句后面。对于在try 子句不引发异常时必须执行的代码
使用 else 子句比向 try 子句添加额外的代码要好,因为它避免了意外捕获由 try ... except 语句保护的代码未引发的异常。
try:
l=[1,2,3]
print(l[2])
except Exception as e:
print(e)
else:
print("没有异常")
#输出:3
没有异常
raise语句抛出异常
raise 语句允许程序员强制发生指定的异常
try:
x=int(input('请输入分子:'))
y=int(input('请输入分母:'))
if y==0:
raise 'ZeroDivisionError'
except ZeroDivisionError as e:
print('引发异常:', repr(e))
#输出
输入一个被除数 x:6
输入一个被除数 y:0
引发异常: ZeroDivisionError('division by zero')
finally语句
如果存在 finally 子句,则 finally 子句将作为try语句结束前的最后一项任务被执行。 finally 子句不论 try 语句是否产生了异常都会被执行,
注意事项:
- 如果在执行try子句期间发生了异常,该异常可由一个 except 子句进行处理。 如果异常没有被某个 except 子句所处理,则该异常会在 finally 子句执行之后被重新引发。
- 异常也可能在 except 或 else 子句执行期间发生。 同样地,该异常会在 finally 子句执行之后被重新引发。
- 如果在执行 try 语句时遇到一个 break, continue 或 return 语句,则 finally子句将在执行break, continue 或 return语句之前被执行。
- 如果 finally 子句中包含一个 return 语句,则返回值将来自 finally 子句的某个 return 语句的返回值,而非来自 try 子句的 return 语句的返回值。
while True:
try:
x=1
y=5
print(x/y)
except Exception as e:
print(e)
else:
print('try 没有异常则执行的代码')
break
finally:
print('无论如何要执行的') #即使有break跳出循环,但是在跳出之前执行了
执行结果
1.0
try 没有异常则执行的代码
无论如何要执行的