视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python中的异常处理学习笔记
2020-11-27 14:40:20 责编:小采
文档

Python 是面向对象的语言,所以程序抛出的异常也是类。

常见的异常类

1.NameError:尝试访问一个没有申明的变量
2.ZeroDivisionError:除数为 0
3.SyntaxError:语法错误
4.IndexError:索引超出序列范围
5.KeyError:请求一个不存在的字典关键字
6.IOError:输入输出错误(比如你要读的文件不存在)
7.AttributeError:尝试访问未知的对象属性
8.TypeError:传给函数的参数类型不正确,比如给 int 函数传入字符型

自定义异常类

尽管内建的异常类已经包括大部分情况,但如果需要创建自己的异常类,可以采用下面的方法:

代码如下:


class CustomException(Exception): # Exception 为所有异常的基类
# 处理异常的代码

捕获异常

代码如下:


try:
# 需要进行捕获异常的代码,只有出现异常之前的代码被最终执行
except (Exception1,Exception2,...) as argument:
# 捕获到 (Exception1,Exception2,...) 里的异常才执行本段代码
# argument 是一个异常类的实例,包含异常的具体信息
except:
# 捕获到 (Exception1,Exception2,...) 以外的异常执行本段代码,用 sys 模块的 exc_info() 函数可以获取异常信息
else:
# 如果没有捕获到异常则执行本段代码
finally:
# 无论是否捕获到异常都执行本段代码


上述语句并不都是必须的,譬如 try...except...、try...finally... 或者 try...except...else... 语句都是可行的。我们还可以 用 try...except...else... 代替 if...else...。

抛出异常

如果我们想要在自己编写的程序中主动抛出异常,可以采用如下两种方法:

raise Exception(reason)

Exception 必须是一个异常类的名称。可选项 reason 用来传递异常的信息。

assert expression[,reason]

assert 是断言的关键字。当表达式 expression 为真则什么都不做,否则抛出 AssertionError 异常。reason 提供异常的信息。

上下文管理器

由于对象 File 支持上下文管理协议,因此可以采用下面的方法打开文件:

代码如下:


with open('filename') as fp:
# 无论本段代码是否出现异常,文件对象 fp 均能正确关闭

Example

代码如下:


import sys

def div(num, den):
print('_________________ (',num,',',den,') ')
try:
ans = num/den
assert den != num, 'Equal' # 断言:分子分母不相等
den = 'Changed' # 如果执行本语句之前未出现异常,改变 den 的值
if num % 2: # 如果分子为奇数,则抛出异常
raise ValueError('Odd')
except ZeroDivisionError as e:
print('except ... as ... ', e)
except:
print('except ', sys.exc_info())
else:
print('else ', ans)
finally:
print('finally ', den)

div(1,0) # 除数为零,为 ZeroDivisionError 异常类
div(1,1) # 分子等于分母,断言为假,抛出异常
div(2,1) # 无异常
div(3,1) # 分子为奇数,通过 raise 抛出异常
div(3,'x') # 不属于 ZeroDivisionError 的其他异常


运行结果:

代码如下:


_________________ ( 1 , 0 )

except ... as ...
division by zero
finally
0
_________________ ( 1 , 1 )

except
(, AssertionError('Equal',), )
finally
1
_________________ ( 2 , 1 )

else
2.0
finally
Changed
_________________ ( 3 , 1 )

except
(, ValueError('Odd',), )
finally
Changed
_________________ ( 3 , x )

except
(, TypeError("unsupported operand type(s) for /: 'int' and 'str'",), )
finally
x

下载本文
显示全文
专题