python 异常处理篇

在这里插入图片描述


Python中的错误可以有两种类型,即语法错误和异常。错误是程序中的问题,由于该问题,程序将停止执行。另一方面,当发生一些内部事件时,会引发异常,这些事件会改变程序的正常流程

语法错误和异常之间的区别

语法错误: 顾名思义,此错误是由代码中的语法错误引起的。它导致程序终止。
例:

# 始化amount变量
amount = 10000

if (amount > 2999)
    print("hallo world")

输出:

image.png

异常: 当程序在语法上正确,但代码导致错误时,会引发异常。此错误不会停止程序的执行,但是,它会更改程序的正常流。
例:

# 初始化 marks 变量
marks = 10000

# 使用0执行除法
a = marks / 0
print(a)

输出:

image.png

在上面的示例中,当我们尝试将数字除以0时,报了除以0的错误

注意: 异常是 Python 中所有异常的基类。可以在此处检查异常层次结构。

常见的错误类型有哪些?

  • IOError: 如果无法打开文件
  • KeyboardInterrupt: 当用户按下不需要的键时
  • ValueError: 当内置函数收到错误的参数时
  • EOFError: 如果在未读取任何数据的情况下命中文件末尾
  • ImportError: 如果找不到模块

常见的异常有哪些?

异常名称描述
IndexError检索到列表的错误索引时。
AssertionError当断言语句失败时发生此问题
AttributeError当属性分配失败时,将发生此错误。
ImportError当找不到导入的模块时,会发生这种情况。
KeyError当找不到字典的键时,就会发生这种情况。
NameError当变量未定义时,将发生此错误。
MemoryError当程序内存不足时,就会发生这种情况。
TypeError当以不正确的类型应用函数和操作时,就会发生这种情况。

捕获异常

try 和 except 语句用于捕获和处理 Python 中的异常。可以引发异常的语句保留在 try 子句中,处理异常的语句写在 except 子句中。

例: 让我们尝试访问其索引越界的数组元素并处理相应的异常。

# 处理简单运行时错误的Python程序
# Python 3

a = [1, 2, 3]
try:
    print("Second element = %d" % (a[1]))

    # 由于数组中只有3个元素,因此引发错误
    print("Fourth element = %d" % (a[3]))

except:
    print("索引超出范围")

image.png

在上面的示例中,可能导致错误的语句放置在 try 语句(在本例中为第二个 print 语句)中。第二个 print 语句尝试访问列表中不存在的第四个元素,这会引发异常。然后,此异常由 except 语句捕获。

如何捕获特定异常,语法

try 语句可以有多个 except 子句,以便为不同的异常指定处理程序。请注意,最多将执行一个处理程序。例如,我们可以在上面的代码中添加 IndexError。添加特定异常的一般语法是 –

# 处理简单运行时错误的Python程序
# Python 3


try:
    #可能引发异常的语句
    ...

except IndexError:
    # 发生索引异常后运行的语句
    ...

except ValueError:
    # 发生值异常后运行的语句
    ...

例: 在 Python 中捕获特定异常

# Program to handle multiple errors with one
# except statement
# Python 3

def fun(a):
    if a < 4:
        # throws ZeroDivisionError for a = 3
        b = a / (a - 3)

    # throws NameError if a >= 4
    print("Value of b = ", b)


try:
    fun(3)
    fun(5)

# note that braces () are necessary here for
# multiple exceptions
except ZeroDivisionError:
    print("发生了ZeroDivisionError")
except NameError:
    print("发生了NameError")

输出

image.png

如果将fun(3) 注释掉,输出将会是:

image.png

上面的输出之所以如此,是因为一旦python尝试访问b的值,就会发生NameError。

else 如果不出现异常执行

在python中,您还可以在 try-except 块上使用 else 子句,该子句必须在所有 except 子句之后存在。仅当 try 子句未引发异常时,代码才会进入 else 块。

例: 尝试使用 else 子句

# 用try-except描述else子句的程序
# Python 3
# 返回a/b的函数
def AbyB(a, b):
    try:
        c = ((a + b) / (a - b))
    except ZeroDivisionError:
        print("不能除以0")
    else:
        print(c)


if __name__ == '__main__':
    # 用于测试上述功能的驱动程序
    AbyB(2.0, 3.0)
    AbyB(3.0, 3.0)

输出:

image.png

finally 无论如何都会执行

Python提供了一个关键字 finally,该关键字始终在try后执行。 finally 始终在try块正常终止后执行,或者在某些异常而终止之后执行。
语法:

try:
    # 可能出现异常的代码....
    ...

except:
    # 捕获异常
    # 异常之后执行的代码
    ...

else:
    # 如果不出现异常之后执行的代码
    ...

finally:
    # 无论如何都会执行的代码
    ...

例:

# Python程序最终演示

# try块中未引发异常
try:
    k = 5 // 0  # 引发“除以零”异常。
    print(k)

# 处理零除法异常
except ZeroDivisionError:
    print("不能除以 0 ")

finally:
    # 始终执行此代码
    # 无论是否生成异常。
    print('这句话无论是否出现异常都会执行')

输出结果:

image.png

Raising Exception 主动抛出异常

raise 语句允许程序员强制发生特定的异常。raise 中的唯一参数表示要提出的例外情况。这必须是异常实例或异常类(从 Exception 派生的类)。

# 描述引发异常的程序

try:
    raise NameError("Hi there")  # 抛出 Error
except NameError:
    print("这是我主动抛出的异常")
    raise  # 确定是否引发了异常

输出:

image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python 中,异常处理是一种处理程序运行时错误的机制。当程序出现错误时,Python 解释器会抛出一个异常,如果不做任何处理,程序将会停止运行。因此,通过异常处理,我们可以在程序出错时,使程序继续运行,或者输出有用的信息提示用户。 下面是一个简单的例子: ```python try: num1 = int(input("请输入一个整数: ")) num2 = int(input("请再输入一个整数: ")) result = num1 / num2 print("两数相除的结果为:", result) except ZeroDivisionError: print("除数不能为零") except ValueError: print("请输入一个整数") ``` 在上面的例子中,我们使用了 try-except 语句来捕获可能发生的异常。如果 try 语句块中的代码运行正常,那么 except 语句块将被跳过;否则,如果 try 语句块中的代码出现异常,那么 except 语句块将会被执行。 在上面的例子中,我们使用了两个 except 语句块来分别处理可能发生的两种异常:除数为零和输入不是整数。如果程序出现这两种异常中的任意一种,相应的 except 语句块将会被执行。 除了使用 except 语句块来捕获异常,我们还可以在 try-except 语句中使用 else 和 finally 语句块。其中,else 语句块用于处理在 try 语句块中没有出现异常时需要执行的代码,而 finally 语句块用于处理无论 try 语句块中是否出现异常都需要执行的代码。 下面是一个更加复杂的例子: ```python import os try: file = open("test.txt", "r") content = file.read() print(content) except FileNotFoundError: print("文件不存在") else: print("文件读取成功") file.close() finally: if os.path.exists("test.txt"): os.remove("test.txt") print("文件删除成功") ``` 在上面的例子中,我们首先尝试打开一个名为 test.txt 的文件,如果文件不存在,则会抛出 FileNotFoundError 异常。如果文件存在,则会读取文件内容,并输出到屏幕上。如果文件读取成功,则会关闭文件。最后,我们使用 finally 语句块来确保文件被删除,无论程序是否出现异常。如果文件删除成功,则会输出相应的提示信息。 总之,异常处理是一种重要的编程技术,它可以帮助我们处理程序运行时可能出现的错误,使程序更加健壮和稳定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

佛系的老肖

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值