「Python」2020.05.09学习笔记 | 第11天全天课 自定义异常+python标准异常+with语句-1

  • 学习测试开发的Day128,真棒!
  • 学习时间为1H
  • 第11天全天课上午视频1H32-1H52M

自定义异常

image.png

可以结合业务规则,做定制化判断

#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基本语法及工作原理

image.png

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352