linqingsheng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1 随笔 :: 0 文章 :: 0 评论 :: 143 阅读

1.获取特定异常的有关信息

通过前面的学习,我们已经可以捕获程序中可能发生的异常,并对其进行处理。但是,由于一个 except 可以同时处理多个异常,那么我们如何知道当前处理的到底是哪种异常呢?

其实,每种异常类型都提供了如下几个属性和方法,通过调用它们,就可以获取当前处理异常类型的相关信息:
  • args:返回异常的错误编号和描述字符串;
  • str(e):返回异常信息,但不包括异常信息的类型;
  • repr(e):返回较全的异常信息,包括异常信息的类型。

举个例子:
  1. try:
  2. 1/0
  3. except Exception as e:
  4. # 访问异常的错误编号和详细信息
  5. print(e.args)
  6. print(str(e))
  7. print(repr(e))
输出结果为:

('division by zero',)
division by zero
ZeroDivisionError('division by zero',)

2.Python try except else详解

使用 else 包裹的代码,只有当 try 块没有捕获到任何异常时,才会得到执行;反之,如果 try 块捕获到异常,即便调用对应的 except 处理完异常,else 块中的代码也不会得到执行。

举个例子:

try:
result = 20 / int(input('请输入除数:'))
print(result)
except ValueError:
print('必须输入整数')
except ArithmeticError:
print('算术错误,除数不能为 0')
else:
print('没有出现异常')
print("继续执行")

可以看到,在原有 try except 的基础上,我们为其添加了 else 块。现在执行该程序:

请输入除数:4
5.0
没有出现异常
继续执行

3.Python try except finally:资源回收

注意,和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。

try:
    a = int(input("请输入 a 的值:"))
    print(20/a)
except:
    print("发生异常!")
else:
    print("执行 else 块中的代码")   
finally :
    print("执行 finally 块中的代码")

运行此程序:

请输入 a 的值:4
5.0
执行 else 块中的代码
执行 finally 块中的代码

可以看到,当 try 块中代码为发生异常时,except 块不会执行,else 块和 finally 块中的代码会被执行。

再次运行程序:

请输入 a 的值:a
发生异常!
执行 finally 块中的代码

可以看到,当 try 块中代码发生异常时,except 块得到执行,而 else 块中的代码将不执行,finally 块中的代码仍然会被执行。

finally 块的强大还远不止此,即便当 try 块发生异常,且没有合适和 except 处理异常时,finally 块中的代码也会得到执行。例如:
try:
    #发生异常
    print(20/0)
 
finally :
    print("执行 finally 块中的代码")

程序执行结果为:

执行 finally 块中的代码
Traceback (most recent call last):
File "D:/LLLproject/pymysql操作数据库/异常处理.py", line 6, in <module>
print(20 / 0)
ZeroDivisionError: division by zero

Python raise用法

raise 语句有如下三种常用的用法:

  1. raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
  2. raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
  3. raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
try:
a = input("输入一个数:")
#判断用户输入的是否为数字
if(not a.isdigit()):
raise ValueError("a 必须是数字")
except ValueError as e:
print("引发异常:",repr(e))

程序运行结果为:

输入一个数:a
引发异常: ValueError('a 必须是数字',)

 

raise 不需要参数

try:
a = input("输入一个数:")
#判断用户输入的是否为数字
if(not a.isdigit()):
raise ValueError("a 必须是数字")
except ValueError as e:
print("引发异常:",repr(e))
  raise

程序执行结果为:

输入一个数:a
引发异常: ValueError('a 必须是数字',)
Traceback (most recent call last):
  File "D:\python3.6\1.py", line 4, in <module>
    raise ValueError("a 必须是数字")
ValueError: a 必须是数字

这里重点关注位于 except 块中的 raise,由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。

当在没有引发过异常的程序使用无参的 raise 语句时,它默认引发的是 RuntimeError 异常。例如:


try:
    a = input("输入一个数:")
    if(not a.isdigit()):
        raise
except RuntimeError as e:
    print("引发异常:",repr(e))
 

程序执行结果为:

输入一个数:a
引发异常: RuntimeError('No active exception to reraise',)

 
posted on   qingshenglin1  阅读(143)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示