admin管理员组

文章数量:821347

python:try...except、else、finally异常处理语句

异常:代码在运行过程中出现的错误,被称为异常。(不包括语法错误)
在python中,一个py文件中的代码,正常情况下,是按照顺序执行的,但是当遇到异常时,会停止程序的运行,如果不想让程序停止并且继续运行,那么就需要使用try…except来捕捉异常,保证代码能够顺畅执行。

下面举一个简单的例子来帮助理解try…except语句的特点:
我们有下面一段代码:

# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。
one_num = int(input("请输入一个数字:"))
# 打印输入的数字
print("输入的数字是:{}".format(one_num))
print("继续执行代码")

那么当我输入的是一个字母时,程序执行到第一行进行int转换时抛出异常,程序执行中断,后面的代码不会再继续执行了。

如果我们使用try…except来处理:

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))
except:print("当try里面的代码出现异常时,执行except中的代码")print("继续执行代码")

所以在使用try…except处理后,当输入的内容不是数字时,会执行except中的语句,并继续往下执行代码:

当输入内容为数字时,执行完try语句中的代码后,跳过except中的代码,继续往下执行:

所以,通过以上的例子可以看出,try…except语句的特点是:
1.当try语句块中的代码出现异常时,不会中断程序的执行;
2.当try语句块中的代码出现异常时,不再继续往下执行try语句块中的代码,而是跳转到except语句块执行代码;
3.当try语句块中的代码无异常时,执行完try语句块中的代码后,会跳过except语句块,继续往下执行程序。

另外,try…except语句中,为了更精确的处理异常信息,可以使用python中的builtins.py中预置的具体错误方法处理。

builtins.py文件中,有很多已经内置好的错误处理方法,我们可以通过这个方法,处理具体的异常。比如,我们有下面一段代码:

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))num = 1/one_num  # 1除以输入的数字print("try中代码结束")
except ValueError:print("当try里面的代码出现值异常时,执行此代码")
except ZeroDivisionError:print("当try里出现除数为0的异常时,执行此代码")print("继续执行代码")

当我们输入的是非数字时,one_num = int(input(“请输入一个数字:”))这一行代码会出现值异常,那么此时,try语句块后面的语句不会继续执行,而是跳转到except ValueError语句块中继续执行,当except ValueError代码块中的代码执行完毕后,会跳过except ZeroDivisionError,继续往后执行:

当我们输入的是数字0时,则在执行num = 1/one_num会出现除数为0的错误,此时try语句块后面的语句不会继续执行,而是跳转到except ZeroDivisionError语句块中继续执行:

所以,通过上面的代码例子可以看出,当有多个except语句时,执行其中一个except之后,其他的except就不会再被执行了。

但是通过上面的例子也可以看出,如果有很多种异常时,则需要写很多个except语句,这会使代码看起来冗长、可读性差。所以,在python中,往往会在同一个except中,使用多个异常:

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))num = 1/one_num  # 1除以输入的数字print("try中代码结束")
except (ValueError, ZeroDivisionError):  # 一个except中,处理了值异常和除数为0的异常print("当try里面的代码出现值异常、或者除数为0的异常时,执行此代码")print("继续执行代码")

上面代码中,当输入非数字时,会执行except中的代码:

输入数字为0时,也会执行except中的代码:

但是,有时候,有一些无法预估的错误信息,如果我们使用具体的异常方法捕获不到,还是会导致代码中断,比如:

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))num = 1/one_num  # 1除以输入的数字print(num1)  # 打印print("try中代码结束")
except (ValueError, ZeroDivisionError):print("当try里面的代码出现值异常、或者除数为0的异常时,执行此代码")print("继续执行代码")

当代码执行到print(num1) 这一行时,有异常,但是try…except语句捕捉不到,导致程序报错,不再继续执行:

这时候,可以使用Exception,来捕获所有的异常。

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))num = 1/one_num  # 1除以输入的数字print(num1)print("try中代码结束")
except (ValueError, ZeroDivisionError):print("当try里面的代码出现值异常、或者除数为0的异常时,执行此代码")
except Exception:print("所有异常信息都可以捕捉到!!!")print("继续执行代码")

上面代码中,执行到print(num1)出现异常,然后跳转except (ValueError, ZeroDivisionError),经判断不属于这两类异常,然后跳转到except Exception,由于except Exception可以捕获所以的异常信息,所以会执行except Exception块中的代码:

可以这么说,当你使用Exception时,可以不用写其他的except语句。比如上面那段代码,我们可以直接把except (ValueError, ZeroDivisionError)这一段代码给注释掉,然后输入非数字、0等,均可以被except Exception捕获:

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))num = 1/one_num  # 1除以输入的数字print(num1)print("try中代码结束")
# except (ValueError, ZeroDivisionError):
#     print("当try里面的代码出现值异常、或者除数为0的异常时,执行此代码")
except Exception:print("所有异常信息都可以捕捉到!!!")print("继续执行代码")


另外,当我们捕获到异常时,为了更清晰的了解异常信息,往往会通过as将异常信息传给一个对象:

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))num = 1/one_num  # 1除以输入的数字print(num1)print("try中代码结束")
except Exception as err:  # 将捕获到的异常传给errprint("所有异常信息都可以捕捉到!!!")print("捕获到的异常信息是:{}".format(err))  # 将异常信息打印出来print("继续执行代码")

如下图,当我们打印err时,会打印捕获到的具体异常信息:

另外,在try…except语句中,还有个可选语句else、finally。

else语句的作用是:当try的代码块中,没有出现异常时,执行else。出现异常时,不执行else。
比如下面这段代码中,当输入1时,try语句块不会出现异常;当输入0时,则会出现异常。

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))num = 1/one_num  # 1除以输入的数字print("try中代码结束")
except Exception as err:print("所有异常信息都可以捕捉到!!!")print("捕获到的异常信息是:{}".format(err))
else:print("else语句")print("继续执行代码")

输入1,跳过except语句块中的代码,直接执行else:

输入0,执行except语句中的代码后,执行跳过else语句块中的代码,继续往下执行:

finally语句的作用是:无论try…except是否出现异常,都会执行finally语句。
我们还是通过下面一段代码去执行验证。下面这段代码中,当输入1时,try语句块不会出现异常;当输入0时,则会出现异常

try:# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。one_num = int(input("请输入一个数字:"))# 打印输入的数字print("输入的数字是:{}".format(one_num))num = 1/one_num  # 1除以输入的数字print("try中代码结束")
except Exception as err:print("所有异常信息都可以捕捉到!!!")print("捕获到的异常信息是:{}".format(err))
finally:print("finally语句")print("继续执行代码")

输入1,执行finally代码块的语句:

输入0,则执行完except中的代码后,继续执行finally:

由此可以看出,无论前面代码是否会抛出异常,最终,否会执行finally语句中的代码。

本文标签: pythontryexceptelsefinally异常处理语句