Python 异常处理

前言

程序设计总是会报错的,之前有谈过几次异常的处理,现在再来说一说:

什么是异常?

当 Python 检测到一个错误时,解释器就无法继续执行了,并且给出一个错误提示。比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然中断。这时候,就需要捕获处理它,否则程序会终止执行。

异常处理

使用 try/except/finally 语句进行捕获操作, 并告诉 Python 发生异常时如何处理。

首先,检测 try 语句块中的错误,except 语句捕获异常信息并处理。如果在 try 子句执行时没有发生异常,Python 将执行 else 语句后的语句,然后控制流通过整个 try 语句。

如果在 try 后的语句里发生了异常,却没有匹配的 except 子句,异常将被递交到上层的 try,或者到程序的最上层,并打印缺省的出错信息。

语法格式

try:
    # 可能触发异常的语句块
except:  # 后面跟一个错误类型,当代码发生错误且错误类型符合的时候,就会执行except中的代码,不写具体错误类型,表示接收任何类型的异常
    # 这里执行异常处理的相关代码,打印输出等
else:
    # 如果没有异常则执行else中的代码
finally:
    # 不管代码是否异常,都会执行,一般是资源的关闭和释放

excep 异常/错误 as 别名,使用别名接收异常对象的错误信息。

如何捕获多个异常?

1. 写出多行except 异常/错误,指定捕获多个不同类型的异常。2. 使用 except (异常1,异常2..),使用元组,在一行中捕获多个不同类型的异常。
异常捕获示例代码:

try:
    print(10/0)
except NameError:
    print('出现 NameError 异常')
except ZeroDivisionError:
    print('出现 ZeroDivisionError 异常')
except IndexError:
    print('出现 IndexError 异常')
except Exception as e :
    print('未知异常',e,type(e))
finally :
    print('无论是否出现异常,该子句都会执行')

抛出异常

我们使用 raise 语句触发自定义异常。

语法格式:
raise 异常类名(附加异常信息)
示例代码:

s = "asdfghjklqwe"
try:
    if len(s) > 10:
        raise Exception("超过10个字符")
except Exception as err:
    print(err)

自定义异常

系统的自带的异常只要触发就会自动抛出,有时候,用户自己决定什么时候抛出,并且给异常加上一些附加信息,这时候就可以使用自定义异常。

示例代码:

# 自定义异常类,创建一个类继承Exception
class MyError(Exception):
    pass
def add(a, b):
    # a小于0,抛出异常
    if a < 0:
        raise MyError('自定义的异常')
    return a + b

print(add(-1, 5))

异常定义好之后,与内置类的用法一样,在需要的时候 raise 出来就可以了。

常见的使用异常的场景

•网络请求相关,比如网络超时、连接异常等。•资源访问相关,比如文件的权限问题、文件的路径、文件是否存在等。•代码逻辑相关,比如越界访问、KeyError 等。