Python异常:简介

发布于:2021-01-22 14:50:30

0

135

0

Python 异常 异常处理 try except

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

Python异常简介

异常与语法错误

语法错误发生在解析器检测到错误语句时。观察以下示例:

>>> print( 0 / 0 ))
 File "", line 1
   print( 0 / 0 ))
                 ^
SyntaxError: invalid syntax

箭头指示解析器在哪里遇到语法错误。在这个例子中,有一个括号太多。删除它并再次运行代码:

>>> print( 0 / 0)
Traceback (most recent call last):
 File "", line 1, inZeroDivisionError: integer division or modulo by zero

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

Python没有显示消息exception error,而是详细说明遇到的异常错误类型。在本例中,它是一个ZeroDivisionError。Python提供了各种内置异常以及创建自定义异常的可能性。

引发异常


如果条件发生,我们可以使用raise引发异常。该语句可以用一个自定义异常来补充。

加薪声明用法说明

如果您想在使用raise发生某个条件时抛出错误,您可以这样做:

x = 10
if x > 5:
   raise Exception('x should not exceed 5. The value of x was: {}'.format(x))

运行此代码时,输出如下所示:

Traceback (most recent call last):
 File "", line 4, inException: x should not exceed 5. The value of x was: 10

程序停止并在屏幕上显示我们的异常,提供出错的线索。

AssertionError异常

除了等待程序中途崩溃之外,您还可以先用Python进行断言。我们知道满足某个条件。如果这个条件是True,那就太好了!程序可以继续。如果条件是False,您可以让程序抛出一个AssertionError异常。

Python断言语句

看看下面的示例,其中断言代码将在Linux系统上执行:

import sys
assert ('linux' in sys.platform), "This code runs on Linux only."

如果您在Linux机器上运行此代码,断言通过。如果要在Windows计算机上运行此代码,断言的结果将是False,结果如下:

Traceback (most recent call last):
 File "<input>", line 2, in <module>
AssertionError: This code runs on Linux only.

在本例中,抛出AssertionError异常是程序最不愿意做的事情。该计划将停止,不再继续。如果那不是你想要的呢?


The  try  and  except  Block: Handling Exceptions

Python中的tryandexcept块用于捕获和处理异常。Python将try语句之后的代码作为程序的“正常”部分执行。except语句之后的代码是程序对上一try条款中所有异常的响应。

该图显示了try和except语句

如您先前所见,当语法正确的代码遇到错误时,Python将引发异常错误。如果未处理,此异常错误将使程序崩溃。该except子句确定您的程序如何响应异常。

以下功能可以帮助您了解tryexcept阻止:

def linux_interaction():
   assert ('linux' in sys.platform), "Function can only run on Linux systems."
   print('Doing something.')

linux_interaction()只能在Linux系统上运行。如果您在Linux以外的其他操作系统上调用assertin,此函数中的in将抛出AssertionError异常。

您可以try使用以下代码为该函数指定a :

try:
   linux_interaction()
except:
   pass

您在此处处理错误的方法是发出pass

你什么都没有 这里的好处是程序没有崩溃。但是,很高兴看到每当您运行代码时是否发生某种类型的异常。为此,您可以将更pass改为会产生信息的消息,例如:

try:
   linux_interaction()
except:
   print('Linux function was not executed')

在Windows计算机上执行以下代码:

Linux function was not executed


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

您没有看到的是由于函数调用而引发的错误类型。为了确切地了解出了什么问题,您需要捕获函数引发的错误。

以下代码是一个示例,您在其中捕获AssertionError并将该消息输出到屏幕:

try:
   linux_interaction()
except AssertionError as error:
   print(error)
   print('The linux_interaction() function was not executed')

在Windows计算机上运行此功能将输出以下内容:

Function can only run on Linux systems.
The linux_interaction() function was not executed

第一条消息是AssertionError,通知您该功能只能在Linux计算机上执行。第二条消息告诉您未执行的功能。

在上一个示例中,您调用了一个自己编写的函数。执行该功能时,您捕获了AssertionError异常并将其打印到屏幕上。

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

try:
   with open('file.log') as file:
       read_data = file.read()
except:
   print('Could not open file.log')

如果file.log不存在,则此代码块将输出以下内容:

Could not open file.log

这是一条信息,我们的程序仍将继续运行。在Python文档中,您可以看到这里可以使用许多内置的异常。该页面上描述的一种异常如下:

Exception  FileNotFoundError

在请求文件或目录但不存在时引发。对应于errno ENOENT。

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

try:
   with open('file.log') as file:
       read_data = file.read()
except FileNotFoundError as fnf_error:
   print(fnf_error)

在这种情况下,如果file.log不存在,则输出为以下内容:

[Errno 2] No such file or directory: 'file.log'

您的try子句中可以有多个函数调用,并且可以预期会捕获各种异常。这里要注意的是,try子句中的代码将在遇到异常后立即停止。

警告:捕获会Exception隐藏所有错误,甚至是完全意外的错误。这就是为什么您应该避免except在Python程序中使用裸子句的原因。相反,您将要引用要捕获和处理的特定异常类。您可以在本教程中详细了解为什么这是个好主意。

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

try:
   linux_interaction()
   with open('file.log') as file:
       read_data = file.read()
except FileNotFoundError as fnf_error:
   print(fnf_error)
except AssertionError as error:
   print(error)
   print('Linux linux_interaction() function was not executed')

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

Function can only run on Linux systems.
Linux linux_interaction() function was not executed

在该try子句中,您立即遇到异常,而未到达尝试打开file.log的部分。现在看一下在Linux机器上运行代码时会发生什么:

[Errno 2] No such file or directory: 'file.log'

以下是关键要点:

  • 一个try条款执行,直到在遇到第一个异常点。

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

  • 您可以预期多个异常,并区分程序应如何应对它们。

  • 避免使用裸except子句。

使用finally

想象一下,在执行代码后,您总是需要执行某种操作来清理。Python允许您使用finally子句来执行此操作。

查看以下示例:

try:
   linux_interaction()
except AssertionError as error:
   print(error)
else:
   try:
       with open('file.log') as file:
           read_data = file.read()
   except FileNotFoundError as fnf_error:
       print(fnf_error)
finally:
   print('Cleaning up, irrespective of any exceptions.')

在前面的代码中,finally子句中的所有内容都将被执行。如果在tryelse子句中遇到异常,则无所谓。在Windows计算机上运行以前的代码将输出以下内容:

Function can only run on Linux systems.
Cleaning up, irrespective of any exceptions.

总结

在了解了语法错误和异常之间的区别之后,您了解了在Python中引发、捕获和处理异常的各种方法。在本文中,您看到了以下选项:

  • raise允许您随时抛出异常。

  • assert允许您验证是否满足某个条件,如果不满足则抛出异常。

  • try子句中,在遇到异常之前,将执行所有语句。

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

  • else允许您编写仅在try子句中未遇到异常时才应运行的代码节。

  • finally允许您执行应该始终运行的代码部分,无论是否有任何以前遇到的异常。