python:异常捕捉try except else finally

225 阅读9分钟

前言

首先我们要知道,我们为什么要使用try except else finally这些语句。
python有自己的异常错误触发系统,如果在执行代码的时候,出现了错误,则自动的就会触发应有的错误。

但是有时候,我们并不想因为一些错误的出现,导致剩下的代码不能执行了,只是我们不想看到的结果,所以使用try except结构语句。
把可能会出现错误的代码放在try中,一旦出现错误,就会去匹配except中对应的错误,然后执行对应的擦操作。try except结构体执行完之后,接着执行结构体下面的代码,并不会因为出错而导致整个代码不执行了。

如果我们不使用try except结构体,一旦执行的时候出行错误,就会报错,traceback,代码就不执行了。

如果想自己主动的引起错误,就使用raise,引发错误之后,后面的代码就不在执行了。

整体的结论

1/try...except...else
   <1> 先执行try语句,如果发生错误,则执行except语句,不执行else语句
   <2> 先执行try语句,如果没有发生错误,不执行except语句,执行else语句
   <3> 总结:只有try语句没有出行错误异常的情况下,才会执行else语句
   
   
2/try...except...finally
   <1> 先执行try语句,如果发生错误,则执行except语句,然后执行finally语句
   <2> 先执行try语句,如果没有发生错误,不执行except语句,执行finally语句
   <3> 总结:无论try语句是否出现错误,最后都会执行finally语句

切记:
  如果有finally语句,那么finally语句是一定会被执行的,
  即使try中有return语句,即使except中有return语句, 即使else中有ruturn语句,
  总之,不管怎样,finally语句是一定会被执行的。

我们使用try except就是为了避免在出现错误的时候,代码停止执行。
我们有时候并不希望一旦出现错误就导致所有的代码都停止执行。
所有使用try cecept结构。
把可能会出现错误的代码放在try语句中,一旦在执行的时候出行错误,就是去匹配except.
如果匹配上了,那么except中该怎么处理就怎么处理,然后继续执行try except之外的代码。

在java中,是try catch finally

图片.png

finally语句是可选的。
使用try将可能出现异常的代码包装起来 ,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,
根据此对象的类型,去catch中进行匹配。
一旦try中出现的异常对象匹配到某一个catch,就进入catch中进行异常的处理。
一旦处理完成,就会跳出当前的try-catch结构(在没有写finally的情况下),然后继续执行后面的代码。
在try语句中定义的变量,只能在try中使用,不能在catchfinally中使用。
(如果是python try except else  finally,try中定义的变量,只能在tryelse语句中使用,
 不能在except和finally语句中使用)
 

参考网址

 https://blog.csdn.net/c_xiazai12345/article/details/119534895

前言

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

直接上干货

下面举一个简单的例子来帮助理解tryexcept语句的特点:
我们有下面一段代码:
# 在控制台里,需要输入一个数字,并转化为int类型。使用int转换是因为input函数接收到的默认都是字符串类型。
one_num = int(input("请输入一个数字:"))
# 打印输入的数字
print("输入的数字是:{}".format(one_num))
print("继续执行代码")

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

图片.png

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

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

图片.png

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

图片.png

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



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

图片.png

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

图片.png

所以,通过上面的代码例子可以看出,当有多个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("继续执行代码")

但是,有时候,有一些无法预估的错误信息,如果我们使用具体的异常方法捕获不到,还是会导致代码中断,比如:
    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("继续执行代码")

可以这么说,当你使用Exception时,可以不用写其他的except语句。
比如上面那段代码,我们可以直接把except (ValueError, ZeroDivisionError)这一段代码给注释掉,然后输入非数字、0等,均可以被except Exception捕获.
另外,当我们捕获到异常时,为了更清晰的了解异常信息,往往会通过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:  # 将捕获到的异常传给err
    print("所有异常信息都可以捕捉到!!!")
    print("捕获到的异常信息是:{}".format(err))  # 将异常信息打印出来

print("继续执行代码")
另外,在tryexcept语句中,还有个可选语句elsefinallyelse语句的作用是:当try的代码块中,没有出现异常时,执行else。出现异常时,不执行else。
比如下面这段代码中,当输入1时,try语句块不会出现异常;当输入0时,则会出现异常。
finally语句的作用是:无论tryexcept是否出现异常,都会执行finally语句。
我们还是通过下面一段代码去执行验证。下面这段代码中,当输入1时,try语句块不会出现异常;当输入0时,则会出现异常

图片.png

图片.png

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