python入门系列:异常处理

引言

系统内部一开始已经内置了一些特定的错误场景,当我们触发了这个场景时,系统内部就会向外界抛出异常。如果我们没有处理,程序就会停止运行。

解决异常

通过条件判断语句在程序内部进行容错检测,避免错误的发生。缺点: 如果要处理的错误太多,会有很多的和业务逻辑无关的代码。

捕捉异常,然后再处理

try:

# 可能出现异常的代码

# 有异常就会抛出,不会再执行剩下的 try后面的代码

except xxxError as xxx:

# 出现异常后,而且被捕捉到的代码

# except可以写多个,用来捕捉多个不同的异常

else:

# 异常未被捕捉到所执行的代码(可以省略)

finally:

# 不管有没有异常都会执行的代码

异常的合并解决

tyr:

1 / 0

print(val)

except (ZeroDivisionError, NameError) as e:

print(e)

else

print("fine like this")

# 执行结果:division by zero

# 如果不清楚异常的具体名字,可以写 Exception进行替代

上下文管理器

# 在主要代码的执行前后分别添加一些操作

# 实现了 __enter__(), __exit__()两个函数的类产生的对象就是上下文管理器

class Test:

def __enter__(self):

return self

def __exit__(self, exc_type, exc_val, exc_tb):

# exc_type: 异常类型

# exc_val: 异常的值

# exc_tb: 异常追踪信息

# 函数有返回值,True表示异常已经处理,False表示异常还未处理

print(exc_val)

return True

with Test() as x: # as 后面表示对象的__enter__()方法执行后的返回值

1 / 0 # 产生的异常信息将对号入座传入__exit__()的函数参数中

# 执行结果: division by zero

# 通过 contexlib模块,通过生成器快速产生一个上下文管理器

import contexlib

# yield之前的代码相当于 __enter__()中的代码,但是返回结果要通过 yield来返回

# yield之后的代码相当于 __exit__()中的代码

@contexlib.contexmanager

def test():

print(1)

yield "x here"

print(2)

with test() as x:

print(3)

print(x)

# 执行结果:

1

3

x here

2

with语句

with open("./xx.txt", "r") as f:

f.readlines()

with open("a.jpg", "rb") as f1, open("b.jpg", "wb") as f2:

content = f1.read()

f2.write(content)

手动抛出异常

# 通过 raise语句手动抛出异常

# 自己设计

def set_age(age):

if age <= 0 or age > 150:

raise ValueError("value error")

print("age is %d" % age)

# 给别人调用

try:

set_age(-18)

except ValueError as e:

print(e)

自定义异常

# 自定义的异常要直接或间接继承自:BaseException

class MyException(Exception):

喜欢python + qun:839383765 可以获取Python各类免费最新入门学习资料!

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

推荐阅读更多精彩内容

  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,823评论 2 16
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,764评论 0 8
  • 食一碗人间烟火,饮几杯人生起落。 人一辈子总会走过一些地方,爱过一些人,并最终落地生根,与一个爱或不爱的人抑或独自...
    Lxyn蓝心阅读 3,800评论 2 8
  • 今天栽棵小树苗,挥铲挖坑很是快,暗自高兴余威在。照常乘车去逛摊,午餐之后混身痛,思前想后栽树因。完了完了真老了,插...
    吾吾斋阅读 117评论 0 0