python3异常处理:try,except和finally – Python3教程

上一章Python教程请查看:python3错误和内置异常

在本文中,你将了解如何使用try、except和finally语句在Python程序中处理异常,这将帮助你用Python编写干净、可读和高效的代码。

Python中的异常是什么?

Python有许多内置的异常,这些异常会在程序出错时强制程序输出错误。

当这些异常发生时,它将导致当前进程停止并将其传递给调用进程,直到处理它为止。如果不处理,我们的程序将崩溃。

例如,如果函数A调用函数B,而函数B又调用函数C,则在函数C中发生异常。

如果不进行处理,就会抛出一条错误消息,我们的程序就会意外地突然停止。

捕获Python中的异常

在Python中,可以使用try语句处理异常。

可以引发异常的关键操作放在try子句中,处理异常的代码写在except子句中。

这取决于我们,一旦我们捕获了异常,我们将执行什么操作,下面是一个简单的例子。

# 导入模块sys获取异常类型
import sys

randomList = ['a', 0, 2]

for entry in randomList:
    try:
        print("entry: ", entry)
        r = 1/int(entry)
        break
    except:
        print(sys.exc_info()[0],"发生.")
        print("Next entry.")
        print()
print(entry,"的倒数",r)

在这个程序中,我们进行循环,直到用户输入一个具有有效倒数的整数,能导致异常的部分放在try块中。

如果没有发生异常,则跳过块并继续正常流。但是,如果发生任何异常,都会被except块捕获。

在这里,我们使用sys模块中的ex_info()函数打印异常的名称,并要求用户再试一次。我们可以看到值‘a’和‘1.3’会导致ValueError,‘0’会导致ZeroDivisionError。

捕获Python中的特定异常

在上面的例子中,我们没有在except子句中提到任何异常。

这不是一个好的编程实践,因为它将捕获所有异常并以相同的方式处理所有情况,们可以指定except子句将捕获哪些异常。

一个try子句可以有任意数量的except子句来以不同的方式处理它们,但是在发生异常时只会执行一个except子句。

我们可以使用值的元组在except子句中指定多个异常。下面是一个伪代码示例。

try:
   # do something
   pass
except ValueError:
   # 处理ValueError异常
   pass
except (TypeError, ZeroDivisionError):
   # 处理多个异常
   # TypeError和eroDivisionError
   pass
except:
   # 处理所有其他异常
   pass

抛出异常

在Python编程中,异常是在运行时出现相应错误时抛出的,但是我们可以使用关键字raise强制抛出异常。

我们还可以选择将值传递给异常,以阐明为什么会引发异常。

>>> raise KeyboardInterrupt
Traceback (most recent call last):
...
KeyboardInterrupt
>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
...
MemoryError: This is an argument
>>> try:
...     a = int(input("Enter a positive integer: "))
...     if a <= 0:
...         raise ValueError("That is not a positive number!")
... except ValueError as ve:
...     print(ve)
...    
Enter a positive integer: -2
That is not a positive number!

try…finally语句

Python中的try语句可以有一个可选的finally子句,不管在什么情况下都会执行这个子句,它通常用于释放外部资源。

例如,我们可以通过网络连接到远程数据中心,或者使用文件或使用图形用户界面(GUI)。

在所有这些情况下,我们必须清理一旦使用的资源,无论它是否成功,这些操作(关闭文件、GUI或断开网络连接)在finally子句中执行,以保证执行。

下面是一个文件操作示例来说明这一点。

try:
   f = open("test.txt",encoding = 'utf-8')
   # 文件操作
finally:
   f.close()

这种类型的构造确保即使发生异常也关闭文件。

来源:

https://www.srcmini02.com/2576.html

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?