发布于:2021-01-22 14:50:30
0
135
0
Python程序一旦遇到错误就会终止。在Python中,错误可以是语法错误或异常。在本文中,您将看到什么是异常以及它与语法错误的区别。之后,您将学习如何提出异常和作出断言。然后,您将演示try-and-except块。
异常与语法错误
语法错误发生在解析器检测到错误语句时。观察以下示例:
>>> 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
异常。
看看下面的示例,其中断言代码将在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
异常是程序最不愿意做的事情。该计划将停止,不再继续。如果那不是你想要的呢?
try
and except
Block: Handling ExceptionsPython中的try
andexcept
块用于捕获和处理异常。Python将try
语句之后的代码作为程序的“正常”部分执行。except
语句之后的代码是程序对上一try
条款中所有异常的响应。
如您先前所见,当语法正确的代码遇到错误时,Python将引发异常错误。如果未处理,此异常错误将使程序崩溃。该except
子句确定您的程序如何响应异常。
以下功能可以帮助您了解try
和except
阻止:
def linux_interaction():
assert ('linux' in sys.platform), "Function can only run on Linux systems."
print('Doing something.')
将linux_interaction()
只能在Linux系统上运行。如果您在Linux以外的其他操作系统上调用assert
in,此函数中的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
子句中的所有内容都将被执行。如果在try
或else
子句中遇到异常,则无所谓。在Windows计算机上运行以前的代码将输出以下内容:
Function can only run on Linux systems.
Cleaning up, irrespective of any exceptions.
总结
在了解了语法错误和异常之间的区别之后,您了解了在Python中引发、捕获和处理异常的各种方法。在本文中,您看到了以下选项:
raise
允许您随时抛出异常。
assert
允许您验证是否满足某个条件,如果不满足则抛出异常。
在try
子句中,在遇到异常之前,将执行所有语句。
except
用于捕获和处理在try子句中遇到的异常。
else
允许您编写仅在try子句中未遇到异常时才应运行的代码节。
finally
允许您执行应该始终运行的代码部分,无论是否有任何以前遇到的异常。
作者介绍