【Python】异常处理

目录

1 什么是异常

2 为什么要处理异常

3 如何处理异常

3.1 try-except语句

3.2 使用except但不带任何异常类型

3.3 使用except且带多种异常类型

3.4 使用多个except语句

3.5 else语句

3.6 finally语句

4 获取异常的特定信息


1 什么是异常

异常是程序执行中发生的错误,不同于语法错误,能够在程序运行前就看到,异常通常是不可预见的。

x = 2 / 0
print(x)
print('运行完毕')

上面的代码看起来没有任何问题,IDE也没有错误提示,但运行后却出现了如下报错。

进行除法或取余运算,分母为0时,会触发ZeroDivisionError异常

 原因在于除法运算中分母不能为0,否则会触发ZeroDivisionError异常。 

 

2 为什么要处理异常

异常是一个对象,表示错误,如果程序执行时发生异常,不去处理就会导致程序意外终止。

在执行上面的代码时,程序结束前没有打印“运行完毕”,因为在执行第二行代码时触发了异常,程序到这里就结束了。

为了让程序顺利地执行完毕,我们需要捕获异常,处理完异常后,程序会继续运行。

 

3 如何处理异常

3.1 try-except语句

Python使用try-except语句捕获处理异常,try子句是可能发生异常的代码,except子句在发生异常后执行,是处理异常的代码。

except关键字后是要匹配的异常类型,只有try子句发生的异常与except语句的异常类型相匹配,except子句才会执行,对异常进行处理,异常处理完后,程序继续运行直到结束。

try:
    x = 2/0
    print(x)
except ZeroDivisionError:
    print('Error:被除数不能为0')
print('运行完毕')
有相匹配的异常处理程序,程序没有终止

 如果发生异常时没有找到相应的异常处理程序,程序就会终止执行。

try:
    x = 2/0
    print(x)
except ValueError:
    print('Error:被除数不能为0')
print('运行完毕')
没有相应的异常处理程序,程序终止执行

 

3.2 使用except但不带任何异常类型

当代码过于庞大时,由于异常的不可预见性,准确地预料可能发生的异常类型和数量,显然是不现实的。

更何况,要记住种类繁多的异常类型不是一件容易的事,也没有这个必要。

不知道可能发生的异常类型和数量,那怎样才能捕获异常呢?答案是——使用不带任何异常类型的except语句。

try:
    x = 2/0
    print(x)
except:
    print('Error:发生异常')
print('运行完毕')
没有具体的异常类型,程序仍正常运行

当except关键字后面不带任何异常类型时,发生异常时会捕获所有的异常类型。

但其缺点也是显而易见的——我们无法得知发生了什么类型的异常,也就无法作出相应的处理。

 

3.3 使用except且带多种异常类型

当可能发生多种异常,且无论发生哪一种异常,其处理程序都相同时,可以使用带多种异常类型的except语句。

try:
    x = 2/0
    print(x)
except (ZeroDivisionError,ValueError,IOError):
    #发生以上异常的其中一种,即执行此处代码
    print('Error:发生异常')

 

3.4 使用多个except语句

当可能发生多种异常,且要对每一种发生的异常作差别化处理时,可以使用多个except语句。

但需要注意的是,

try:
    x = 2/0
    print(x)
except ZeroDivisionError:
    print('Error:被除数不能为0')
except ValueError:
    print('Error:数值有误')
except IOError:
    print('Error:输入有误')

 

3.5 else语句

 有时我们会希望在没有发生异常的时候才执行某些代码,这时可以在except语句后面使用else语句,else子句只会在没有发生异常的情况下执行。

try:
    x = 2 / 1
    print(int(x))
except:
    print('Error:发生异常')
else:
    print('没有发生异常')

 

3.6 finally语句

和else语句只在没有异常时才执行不同,无论是否发生异常,finally语句都会执行。

try:
    x = 2 / 0
    print(int(x))
except:
    print('Error:发生异常')
finally:
    print('程序结束')

 

4 获取异常的特定信息

由于一个except语句可以处理多个异常,但如何得知处理的哪种异常呢?

事实上,每种异常类型都提供了几个属性和方法, 通过调用它们,可以获得当前处理异常的相关信息。

  • args:返回异常的错误编号和描述字符串;
  • str(e):返回异常信息,但不包括异常信息的类型;
  • repr(e):返回较全的异常信息,包括异常信息的类型。

由于 except 可能接收多种异常,因此为了操作方便,可以直接给每一个进入到此 except 语句的异常,起一个统一的别名 e 

try:
    x = 2 / 0
    print(int(x))
except(ZeroDivisionError,ValueError,IOError)as e:
    print(e.args)
    print(str(e))
    print(repr(e))
运行结果

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cimoon_

一分也是爱,用钱砸我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值