- 学习测试开发的Day128,真棒!
- 学习时间为1H
- 第11天全天课上午视频1H32-1H52M
自定义异常
可以结合业务规则,做定制化判断
#coding=utf-8
class ShortInputException(Exception):
'''A user-defined excepiton class.'''
def __init__(self,length,atleast):
Exception.__init__(self)
self.length=length
self.atleast=atleast
try:
s=input('Enter something -->')
if len(s)<3:
#如果输入的内容长度小于3,触发异常
raise ShortInputException(len(s),3)
except EOFError:
print('\nwhy did you do an EOF on me ?')
except ShortInputException as x:
print('ShortInputException : The input was of length %d,\was expecting at least %d' %(x.length,x.atleast))
else:
print('No exception was raised.')
输出:
PS D:\0grory\day11> python .\2zdyc.py
Enter something -->2
ShortInputException : The input was of length 1,\was expecting at least 3
PS D:\0grory\day11>
异常抛出机制:
1、如果在运行时发生异常,解释器会查找相应的处理语句(称为handler)。
2、要是在当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看
那里能不能处理。
3、如果在最外层(全局“main”)还是没有找到的话,解释器就会退出,同时打印
出traceback以便让用户找到错误产生的原因。
注意:
虽然大多数错误会导致异常,但一个异常不一定代表错误,有时候它们只是一个
警告,有时候它们可能是一个终止信号,比如退出循环等
没有捕获异常机制的示例代码:
#coding=utf-8
a=int("abc")
print('ok')
输出:
PS D:\0grory\day11> python .\ycjz.py
Traceback (most recent call last):
File ".\ycjz.py", line 2, in <module>
a=int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
PS D:\0grory\day11>
有捕获异常机制的示例代码1-Error:
#coding=utf-8
try:
a=int("abc")
except:
print('有错误产生了!')
print('ok')
输出:
PS D:\0grory\day11> python .\ycjz.py
有错误产生了!
ok
PS D:\0grory\day11>
有捕获异常机制的示例代码1-能捕获到异常的ValueError:
#coding=utf-8
try:
a=int("abc")
except ValueError:
print('有错误产生了!')
print('ok')
输出:
PS D:\0grory\day11> python .\ycjz.py
有错误产生了!
ok
PS D:\0grory\day11>
有捕获异常机制的示例代码1-不能捕获到异常的TypeError:
#coding=utf-8
try:
a=int("abc")
except TypeError:
print('有错误产生了!')
print('ok')
输出:
PS D:\0grory\day11> python .\ycjz.py
Traceback (most recent call last):
File ".\ycjz.py", line 3, in <module>
a=int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
PS D:\0grory\day11>
有捕获异常机制的示例代码1-try中也不一定安全:
#coding=utf-8
try:
a=int("abc")
except ValueError:
1/0
print('有错误产生了!')
print('ok')
输出:
PS D:\0grory\day11> python .\ycjz.py
Traceback (most recent call last):
File ".\ycjz.py", line 3, in <module>
a=int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File ".\ycjz.py", line 5, in <module>
1/0
ZeroDivisionError: division by zero
PS D:\0grory\day11>
有捕获异常机制的示例代码1-try中也不一定安全--再加try:
#coding=utf-8
try:
a=int("abc")
except ValueError:
print('有错误产生了!')
try:
1/0
except:
print('有错误产生了!')
print('ok')
输出:
PS D:\0grory\day11> python .\ycjz.py
有错误产生了!
有错误产生了!
ok
PS D:\0grory\day11>
有捕获异常机制的示例代码1-try中也不一定安全--再加try+raise:
#coding=utf-8
try:
a=int("abc")
except ValueError:
print('有错误产生了!')
try:
1/0
except:
print('有错误产生了!')
raise Exception('除法错误!')
print('ok')
输出:
PS D:\0grory\day11> python .\ycjz.py
有错误产生了!
有错误产生了!
Traceback (most recent call last):
File ".\ycjz.py", line 3, in <module>
a=int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File ".\ycjz.py", line 7, in <module>
1/0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File ".\ycjz.py", line 10, in <module>
raise Exception('除法错误!')
Exception: 除法错误!
PS D:\0grory\day11>
写了一个函数,当收到不规则的传参时候,函数不知道具体异常处理规则,则可以抛出异常,由调用函数的人进行处理。
raise放到哪里都可以,放函数中最多
Python标准异常
异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告
标准异常说明
上面列举的标准异常集,所有的异常都是内建的.。所以它们在脚本启动前或在互
交命令行提示符出现时已经是可用的了。
所有的标准/内建异常都是从根异常派生的。目前,有3 个直接从BaseException
派生的异常子类:SystemExit,KeyboardInterrupt 和Exception。其他的所有的
内建异常都是Exception 的子类。
Python2.5开始,所有的异常的都是BaseException 的子类
With语句
With介绍:
with是从Python2.5引入的一个新的语法,它是一种上下文管理协议,目
的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关
代码统统去掉,简化try….except….finlally的处理流程。with通过
enter方法初始化,然后在exit中做善后以及处理异常。所以使用
with处理的对象必须有enter()和exit()这两个方法。其中
enter()方法在语句体(with语句包裹起来的代码块)执行之前进入运
行,exit()方法在语句体执行完毕退出后运行。
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生
异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、
线程中锁的自动获取和释放等
With基本语法及工作原理
With实例
打开文件并读取
#encoding=utf-8
with open(r'd:\tel.txt') as fp:
content=fp.read()
print(content)
执行:
PS D:\0grory\day11> python .\mywith.py
13708175001
13806758001
13609424001
13600962001
13603121001
13803353001