5 个使用 try、except 和 finally 处理异常的 Python 示例

举报
Tiamo_T 发表于 2021/10/05 10:03:42 2021/10/05
【摘要】 python 中的异常是语法正确的语句抛出的错误。它们终止脚本的执行。异常的一些示例是 NameError、TypeError、AssertionError、ConnectionAbortedError 等。可以处理这些中止以防止脚本不可预测地终止。本篇涵盖以下示例:Python try-except 块Python 中的多异常处理Python finally 块 - 发生异常时Python...

python 中的异常是语法正确的语句抛出的错误。

[Python Exception Handling]

它们终止脚本的执行。异常的一些示例是 NameError、TypeError、AssertionError、ConnectionAbortedError 等。

可以处理这些中止以防止脚本不可预测地终止。

本篇涵盖以下示例:

  1. Python try-except 块
  2. Python 中的多异常处理
  3. Python finally 块 - 发生异常时
  4. Python finally 块 - 当没有异常时
  5. Python 嵌套 try-except 块

看看下面的代码:

t
a = 12
s = "hello"
print(a+s)

Output:


Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

这里的打印函数语法是正确的,但是整数和字符串的相加是错误的。因此 TypeError 是由 python 解释器引发的。

1. Python try-except 块

处理异常涉及的关键字是 try、except 和 finally。

Try 块后面必须跟一个 except 块。finally 块的添加是可选的。

try 块中的语句是逐行执行的。如果执行任何语句抛出异常。跳过此块中的其余语句并开始执行 except 块。

例子:

a = 12
s = "hello"
try:
    print("inside try")
    print(a + s) # will raise TypeError
    print("Printed using original data types")
except TypeError: # will handle only TypeError
    print("inside except")
    print(str(a) + s)
    print("Printed using type-casted data types")

输出:

inside try
inside except
12hello
Printed using type-casted data types

这里 TypeError 在 try 块内的第 2 行的执行中引发。因此,其余语句的执行被跳过,除了块执行开始。请注意,要处理的异常与 except 关键字一起提到。

2. Python 中的多异常处理

可以使用单个 try-except 块处理多个异常。这是通过提及异常名称来完成的,在括号内以逗号分隔,紧跟在 except 关键字之后。

try:
    if (3 + 4 - 5) > 0:
        a = 3
        a.append("hello")  # throws AttributeError
    else:
        print("hello" + 4)  # throws TypeError
except (AttributeError, TypeError) as e:
    print("Error occurred:", e)

输出:

Error occurred: 'int' object has no attribute 'append'

3. Python finally 块——当异常发生时

finally 是位于 except 块之后的块。无论是否遇到异常,都会执行该语句块。

将 finally 块添加到上一个示例中:

try:
    if (3 + 4 - 5) > 0:
        a = 3
        a.append("hello")  # throws Attribute Error
    else:
        print("hello" + 4)  # throws TypeError
except (AttributeError, TypeError) as e:
    print("Error occurred:", e)
finally:
    print("try except block successfully executed")

输出:

Error occurred: 'int' object has no attribute 'append'
try except block successfully executed

这里 try 中的语句引发了异常,除了块被执行,然后是 finally 块。

4. Python finally 块——当没有异常时

再看一个例子:

try:
    if (3 + 4 - 5) < 0:
        a = 3
        print(a + 5)  # simple addition
    else:
        print("hello" + "4")  # string concatenation
except (AttributeError, TypeError) as e:
    print("Error occurred:", e)
finally:
    print("try except block successfully executed")

输出:

8
try except block successfully executed

在这里我们看到即使except块从未执行过,finally块也被执行了。

如果 except 和 finally 块中的语句引发异常,则剩余的脚本执行将终止。

5. Python 嵌套 try-except 块

一个 try-except 块可以被另一个 try-except 块包围。

import json
import sys

try:
    with open("hello.json") as fp:
        try:
            json_dict = json.load(fp)
        except json.JSONDecodeError:
            print("Json file does not exist")
    print(json_dict)
except:
    print("error occurred while parsing json:", sys.exc_info()[1])

输出:如果 hello.json 存在

{'name': 'Aanisha', 'surname': ‘Mishra'}

输出:如果 hello.json 不存在

error occurred while parsing json: [Errno 2] No such file or directory: 'hello.json'

输出:如果 hello.json 不是有效的 json 文件

Json file does not exist
error occurred while parsing json: name 'json_dict' is not defined

这种形式的解决方案也可以处理在 except 或 finally 块中引发的异常。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。