介绍

Python 检测到一个错误时,解释器就无法继续执行了。反而会出现一些错误的提示,这就是所谓的异常

例如这里,打开一个不存在的文件,就会报异常了。

f = open("python.txt", "r", encoding="utf-8")

Traceback (most recent call last):
  File "/Users/aaron/Desktop/py/hello.py", line 1, in <module>
    f = open('python.txt', 'r', encoding='utf-8')
FileNotFoundError: [Errno 2] No such file or directory: 'python.txt'

Process finished with exit code 1

捕获异常

try:
    open("python.txt")
except IOError:
    print("文件不存在")

获取异常的信息描述

try:
    open("python.txt")
except IOError as result:
    print("异常的提示信息是:%s" % result)

except 捕获多个异常

try:
    print(num)
except IOError:
    print("出错了")

捕获的错误类型是 IOError,而程序产生的异常为 NameError ,所以没有捕获到

try:
    print(num)
except NameError:
    print("出错了")

捕获多个异常

try:
    open("pyhton.txt")
    print(num)

except (NameError, IOError):
    print("又出错了")

捕获所有异常

try:
    open("pyhton.txt")
    print(num)

except Exception as result:
    print(result)

else

如果没有捕获到异常,那么就执行 else 中的代码

try:
    num = 100
    print(num)
except NameError as errorMsg:
    print('出错了:%s' % errorMsg)
else:
    print('一切正常')

try...finally...

一个段代码必须要执行,无论异常是否产生都要执行,那么此时就应该用 finally

例如访问一个不存在的文件,不管有没有异常,都要关闭文件。

f = None
try:
    f = open('python.txt', 'r', encoding='utf-8')
    print(f.read())
except FileNotFoundError:
    print('无法打开指定的文件!')
except LookupError:
    print('指定了未知的编码!')
except UnicodeDecodeError:
    print('读取文件时解码错误!')
finally:
    if f:
        f.close()

如果用 with,可以不用写 finally。反正程序结束后,会自动释放文件资源。

try:
    with open('python.txt', 'r', encoding='utf-8') as f:
        print(f.read())
except FileNotFoundError:
    print('无法打开指定的文件!')
except LookupError:
    print('指定了未知的编码!')
except UnicodeDecodeError:
    print('读取文件时解码错误!')

抛出自定义异常

可以用 raise 语句来抛出一个异常。异常/错误对象必须有一个名字,而且它们应是 ErrorException 类的子类

class PasswordError(Exception):
    def __init__(self, length, at_least):
        super().__init__()
        self.length = length
        self.at_least = at_least


try:
    password = input("请输入密码:")
    if len(password) < 6:
        # raise 抛出一个自定义异常
        raise PasswordError(len(password), 6)

except PasswordError as result:
    print("错误: 你输入的密码长度是 %d, 密码的长度至少应是 %d" % (result.length, result.at_least))
else:
    print("填写正确")