python exceptions_Python Exceptions介绍

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

目录异常与语法错误

抛出异常

AssertionError异常

try/except块:处理异常

else语句

使用finally语句做最后后清理

汇总

Python程序一旦遇到错误就会终止。 在Python中,错误可能是语法错误或异常。 在本文中,您将看到什么是异常以及它与语法错误的区别。 之后,您将了解如何抛出异常和做出断言。 然后,您将看到try和except块的演示。

异常与语法错误

解析器检测到错误的语句时会发生语法错误。 观察下面的例子:

箭头指出解析器遇到语法错误的位置。 在这个例子中,多了一个右括号。 删除它并再次运行你的代码:

这一次,你遇到了一个异常错误。 无论何时语法正确的Python代码导致错误,这种类型的错误就会发生。 消息的最后一行指出了遇到的异常错误类型。

Python不会显示exception error消息,而是详细说明遇到了什么类型的异常错误。 在这种情况下,它是一个ZeroDivisionError。 Python带有各种内置的异常,同样也可以创建自定义异常。

抛出异常

如果某种条件发生,我们可以使用raise来抛出异常。 该声明可以实现一个自定义异常。

如果你想在某种情况发生时使用raise来抛出错误,你可以这样做:

当你运行这段代码时,输出如下:

该程序停下来,并将异常显示到屏幕,提供有关错误的线索。

AssertionError异常

与其等待程序中途崩溃,您还可以先在Python中进行断言。 我们断言某个条件得到满足。 如果这种情况证明是True,那很好! 该程序可以继续。 如果断言结果为False,你可以让程序抛出一个AssertionError异常。

看看下面的例子,它断言代码将在Linux系统上执行:

如果您在Linux机器上运行此代码,则断言会通过。 如果您要在Windows计算机上运行此代码,则断言的结果将为False,输出如下所示:

在这个例子中,抛出一个AssertionError异常是该程序最后一件事。 程序将停止并不再继续。 如果这不是你想要的呢?

try和except块:处理异常

Python中的try和except块用于捕获和处理异常。 Python将try语句之后的代码作为程序的“正常”部分执行。 except语句后面的代码是程序对前面的try子句中的任何异常的响应。

正如您前面所看到的,当语法正确的代码遇到错误时,Python将抛出异常错误。 如果该程序未处理它,该异常错误会使程序崩溃。 except子句决定程序如何响应异常。

以下函数可以帮助您了解try和except块:

linux_interaction()只能在Linux系统上运行。 如果在除Linux以外的操作系统上调用该函数,则此函数中的断言将引发AssertionError异常。

你可以使用下面的代码试试这个函数:

这里处理错误的方式是直接使用pass。 如果您要在Windows机器上运行此代码,您将得到以下输出:

没有任何输出。 这里的好处是该程序没有崩溃。 但是,如果您运行代码时发现某种类型的异常,可能会好些。 为此,您可以将pass更改为可生成消息的内容,如下所示:

在windows上执行这段代码:

当运行此函数的程序中发生异常时,程序将通知您函数调用不成功的事实同时继续运行。

你没有看到的是由于函数调用而抛出的错误类型。 为了准确地查看出了什么问题,您需要捕捉函数抛出的错误。

以下代码是捕获AssertionError并将该消息输出到屏幕的示例:

在Windows上运行此功能会输出以下内容:

第一条消息是AssertionError,通知您该函数只能在Linux上执行。 第二条消息告诉你哪个功能没有执行。

在前面的例子中,你调用了自己写的一个函数。 当执行该函数时,捕获了AssertionError异常并将其打印到屏幕上。

以下是另一个打开文件并使用内置异常的示例:

如果file.log不存在,这段代码将输出以下内容:

这是一条信息丰富的消息,我们的程序仍将继续运行。 在Python文档中,可以看到有很多可用的内置异常。 该页面上描述的一个异常如下:

要捕获这种类型的异常并将其打印到屏幕上,可以使用以下代码:

在这种情况下,如果file.log不存在,则输出如下所示:

您可以在try子句中使用多个函数调用,并预计捕获各种异常。 这里需要注意的是,try子句中的代码只要遇到异常就会停止。警告:捕捉异常会隐藏所有错误...即使是那些完全意外的错误。 这就是为什么你应该避免在你的Python程序中使用空except子句。 相反,你会想要引用你想要捕获和处理的特定异常类。 您可以在本教程中了解更多关于这样做的好处。

看下面的代码。 在这里,你首先调用linux_interaction()函数,然后尝试打开一个文件:

如果文件不存在,在Windows上运行此代码将输出以下内容:

在try子句中,您立即遇到了异常,并没有进入您尝试打开file.log的部分。 现在看看在Linux上运行代码时会发生什么:

关键要点如下:执行try子句直到遇到第一个异常。

在except子句或异常处理程序中,您可以确定程序如何响应异常。

您可以预见多个异常,并区分程序应该如何响应它们。

避免使用空except子句。

else子句

在Python中,使用else子句,只有在没有异常的情况下,才能指示程序执行某个代码块。

看一下下面的例子:

如果您要在Linux系统上运行此代码,则输出结果如下所示:

由于该程序没有遇到任何异常,因此执行了else子句。

您还可以尝试在else子句中运行代码,并捕获可能的异常:

如果您要在Linux上执行此代码,您将得到以下结果:

从输出中,您可以看到linux_interaction()函数运行。 由于没有遇到任何异常,因此尝试打开file.log。 由于该文件不存在而无法打开,引发了FileNotFoundError异常。

使用finally语句做最后后清理

想象一下,执行代码后,你总是必须执行某种操作来清理。 Python可以使用finally子句进行操作。

来看看下面的例子:

在前面的代码中,finally子句中的所有内容都将被执行。 即使在try或else子句中遇到异常,也不会影响finally子句的执行。 在Windows上运行以前的代码将输出以下内容:

汇总

在看到语法错误和异常之间的区别之后,您了解了在Python中抛出,捕获和处理异常的各种方法。 在本文中,您看到了以下选项:raise允许你随时抛出异常。

assert使您能够验证是否符合某个条件,如果不符合则抛出异常。

在try子句中,遇到异常之前的所有语句都会执行。

except用于捕获和处理try子句中遇到的异常。

else使你可以编写只有在try子句中没有遇到任何异常时才能运行的代码。

finally使您能够执行应始终运行的代码段,无论是否遇到任何异常。

希望这篇文章能够帮助您理解Python在处理异常时提供的基本工具。英文原文:https://realpython.com/python-exceptions/

译者:javylee

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值