说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
为了让程序正常运行,不至于在发生异常时被终止执行并报错,可以编写处理所选异常的程序。其中,对于进入死循环或者长时间卡死的程程序可以使用 Control-C 中断执行。
基本的语法结构如下:
try:
<语句> # 正常运行的代码
except <错误类型>:
<语句> # 如果在 try 引发 '错误类型' 异常后执行的代码
except <错误类型2>:
<语句> # 如果引发了'错误类型2'异常后执行的代码
else:
<语句> # 如果没有异常发生
try
后的语句为正常的逻辑代码语句,如果遇到下边 except
中第一个匹配的异常,则按异常处理中的语句执行。如果没有指定,则执行 else
中的语句,else 不是必须的。
以下例子为打开一个文件,并读取内容,可是这个文件不存在,会抛出 IOError
异常,我们通过 except
进行捕获:
try:
file = open("haha.txt")
file.read()
except IOError:
print('读取文件错误')
当然,我们可以不指定错误类型,捕获所有异常:
try:
file = open("haha.txt")
file.read()
except:
print('读取文件错误')
但不建议这么做,不符合规范,异常情况比较多的情况下,不能让我们识别具体是什么异常。
假设,我们定义了一个除法函数:
def fn(x, y):
return x/y
这个函数不是很健壮,有以下问题:
为了解决以上问题,我们需要识别多个异常。大多情况下,我们需要识别多种异常,可以写多个 except
子句:
def fn(x, y):
try:
return x/y
except ZeroDivisionError:
return 'y 不能为0'
except TypeError:
return 'x 或 y 都不能为字符'
执行后的结果:
fn(-1,'0') # 'x 或 y 都不能为字符'
fn(-1, 0) # 'y 不能为0'
有时候我们不需要区别具体是什么错误,可以让这些异常组成元组,统一给出处理:
def fn(x, y):
try:
return x/y
except (ZeroDivisionError, TypeError):
return '参数不合法'
执行后的结果:
fn(-1,'0') # ''参数不合法'
fn(-1, 0) # '参数不合法'
另外,我们可以将 y 为 0 时不合法的情况做特殊处理,例如,让 y 为 1:
def fn(x, y):
try:
return x/y
except ZeroDivisionError:
y = 1
return x/y
执行时,如果 y 传 0 就按 1 处理:
fn(-1, 0) # -1.0
else 是可选的,当没有发生异常时执行,必须放在所有的 except
子句最后:
def fn(x, y):
try:
z = x/y
except ZeroDivisionError:
return '参数不合法'
else:
return z
finally 是可选的,无论是否出现异常都会执行,必须放在所有的 except
子句 和 else 最后:
def fn(x, y):
try:
z = x/y
except ZeroDivisionError:
return '参数不合法'
else:
return z
finally:
print('执行完毕')
有时候我们需要看一下异常的具体内容文本,可以通过 as e 之类,e 为变量可以自定义,如 err 等都可以,然后再使用这个变量:
def fn(x, y):
try:
return x/y
except ZeroDivisionError as e:
return e
执行结果:
fn(-1, 0)
# ZeroDivisionError('division by zero')
可以根据需要对异常处理进行嵌套:
def fn(x, y):
try:
try:
return x/y
except TypeError:
return '参数不合法'
except ZeroDivisionError as e:
print(f'错误:{e}')
Exception 是最基础的类,所有的错误都继承自它,如果不知道会发生什么错误,则可以用它来捕获:
try:
print(1/0)
except Exception as err:
print(f'error occurred: {err}')
# error occurred: division by zero
raise 语句允许程序员强制发生指定的异常:
def fn(x, y):
try:
return x/y
except TypeError:
raise TypeError('参数不能是字符')
raise 唯一的参数就是要抛出的异常。这个参数必须是一个异常实例或者是一个异常类(派生自 Exception 的类)。如果传递的是一个异常类,它将通过调用没有参数的构造函数来隐式实例化。
执行:
fn(9, '9')
# ....
# TypeError: 参数不能是字符
如果你需要确定是否引发了异常但不打算处理它,则可以使用更简单的 raise 语句不给异常类型形式重新引发异常。
更新时间:2023-12-23 18:18:31 标签:python 异常