EAFP 原则#

EAFP 原则是 Python 世界中的一个基本缩写词汇,与诸如 KISS(kep it simple, stupid!)和 DRY(don’t repeat yourself)等一样。EAFP 表示“it’s Easier to Ask for Forgiveness than Permission.”(请求原谅比请求许可更容易)。 但是,这意味着什么呢?

简而言之,这意味着应该意识到 Python 中的 try:... except:... 语法非常有用,可以放心使用!

try: … except: …#

先看下面的代码段

while True:
    try:
        num = int(input("Integer >>> "))
        break
    except ValueError:
        print("Please write a valid integer!")

print(f"Your integer was {num}.")

这段代码是什么意思?

在上述代码中,创建了一个无限循环,直到当用户输入一个有效的整数才终止循环。为此,使用了 try: ... except: ... 语句。

Try#

关键词 try 的作用是用于捕获其下的语句块中的代码在程序运行时可能出现的错误。

我们希望用户输入一个有效的整数,以便可以转换并将其赋值给num ,但我们不知道用户实际上会输入什么。如果用户输入类似于 asdfasfd12.4,调用 int(...) 时就会抛出 ValueError 错误。当用户犯错误时,我们希望让他们有机会改正,这就是 except: ... 的用途。

Except#

关键词 except 的作用是:只有当 try 下面的程序在运行时报错了,excep 才被唤醒。

如上面代码那样,如果用户输入了不能被转化为整数的对象,在调用 int() 的时候就会抛出 ValueError 异常,并且程序会跳转到 except ValueError: ... 部分。

注意,你必须在编写 except 之前能够正确地预计到 try 中的错误类型。比如上面代码中,预计会爆出 ValueError 异常,那么就写 except ValueError ,如果预计的是 TypeError 类型的异常,就写 except TypeError

不要只用一个 except#

Python 语法允许这样的代码:

try:
    num = int(input("Integer >>> "))
except:
    print("Please write a valid integer!")

在这段代码中,移除了 except 后面的异常类型 ValueError

这就是告诉 Python 程序,不论 try 下面的程序中爆出什么类型的错误和异常,都应该被 except 捕获。像这种不对特定异常进行处理的情景,我们可称之为“bare except” 。

写“bare except”不是好习惯,应该禁止。

原因何在?针对上面的代码,举个例子说明。如果用户输入的是 Ctrl + C ,其本意是要终止循环并退出程序,但实际上对于以上代码,因为这种输入对 try 而言是 KeyboardInterrupterror 异常,“bare except” 会捕获所有异常,也包括这种。也就是说,程序在退出之前还会执行 except 下面的代码,这或许并不是我们希望的。

同样的道理,也应该避免使用 except Exception: 这种写法。

最好的写法,就是要在 except 后面指明异常类型,然后在代码块中对这种异常进行处理。