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各类免费最新入门学习资料!

原文地址:http://blog.51cto.com/14186420/2349772

时间: 2024-08-30 01:50:43

python入门系列:异常处理的相关文章

python入门系列:函数

引言 将一段代码集中到一块,起一个名字,下次可以根据这个名字再次使用这个代码块.作用:方便代码重用分解任务,简化程序逻辑使代码更加模块化函数的参数 所有的传参方式都是传引用,注意列表做参数和数值做参数容易出现的问题. 单个参数 多个参数 定义方式 def funName(arg1, arg2, arg3...):pass 调用方法 funName(arg1, arg2, arg3...) # 形参和实参一一对应funName(arg2=v2, arg3=v3, arg1=v1) # 指明形参的名

python入门系列:面向对象

类和对象的创建 类 经典类 没有继承 object的类 新式类 继承了 object的类 class Money: # 2.x中默认是经典类,3.x中是新式类pass class Money(object): # 兼容的一种写法pass Money既是类的name属性名,又是一个引用该类的变量 print(Money.name) # Moneyxxx = Moneyprint(xxx.name) # Money对象 one = Money()print(one) # <main.Money ob

python入门系列:Python基础知识

Python注释 单行注释 这是一个单行注释 print("test")多行注释 '''这里就是python的多行注释方式可以直接分行进行注释操作本质上是字符串'''import thisprint("hello world")特殊注释 #!/usr/bin/python3指定解释器的版本#encoding=utf-8python 2.x解决中文文本乱码Python变量 变量使用 使用之前不用声明:做参数传递时,所有的变量都是引用 定义变量 arg = val a

python入门系列:Python中一切皆对象

引言 Java语言也是面向对象的语言,但是Python要更加彻底Python的面向对象特性,是它使用起来灵活的根本所在对象的特点 可以赋值给一个变量 函数也是对象 def test(name):print(name) my_func = test # 注意 只写函数名 和 函数名加括号 的区别my_func("MetaTian") # 打印:MetaTian可以添加到集合中去 def plus(a, b):print(a+b) def minus(a, b):print(a-b)fun

python入门系列:Python使用虚拟环境

虚拟环境 背景 有两个项目,A和B.都依赖一个模块m,但是他们所需要的版本不一样.默认的情况是,只能安装一个版本的模块m.所以一台电脑上,两个项目无法同时运行. 解决方案 创建一个独立的局部python环境,在这个环境中,安装相关的库,如果有多个项目,则创建多个局部环境.平行宇宙即视感. 虚拟环境准备 想要创建平行宇宙,还得依赖一个三方包:virtualenv安装命令:pip install virtualenv使用虚拟环境 创建一个虚拟环境 使用命令:virtualenv dirname,也可

python入门系列:包和模块

基本概念 模块:将一组功能相关的代码写入一个单独的.py文件中,需要时进行导入,这个文件就是模块.包:有层次的文件目录结构,内部有多个模块或多个子包,一般要有init.py这个文件(3.3+ 的版本不需要).库:完成一定功能代码的集合,完成的功能一般更加广泛,可以是模块,也可以是包.框架:通过框架,可以快速实现解决某一个问题所需的代码骨架,后期进行填充即可.包和模块的作用 造轮子,工具代码,供其他模块使用(模块化编程)划分了变量作用域,解决变量/函数重名的问题包和模块分类 内建的模块:built

python入门系列:文件操作

操作模式 r """以只读方式打开文件(默认),文件的指针会放在文件的开头若文件不存在,会报错"""f = open("a.txt", "r") # 在同级目录下打开文件content = f.read()print(content)w """以只写方式打开文件,文件的指针也在文件开头,进行覆盖写入(先清空后写入)若文件不存在,会创建一个新的文件""&quo

python入门系列:Python数据类型

整数 二进制 n1 = 0b1010 八进制 n2 = 0o567 十六进制 n3 = 0xfdc2浮点数 一般形式 n1 = 3.14 科学计数法 n2, n3 = 3.2e6, 1.2e-3简单数学函数 内建函数 abs(num): 返回数的绝对值 n1, n2, n3 = 1, 0, -1print(abs(n1), abs(n2), abs(n3)) # 1 0 1max(num) 和 min(num): 参数不定长 n1, n2, n3, n4 = 1, 2, 3, 4print(ma

python——入门系列(一)索引与切片

1.索引和切片:python当中数组的索引和其他语言一样,从0~n-1,使用索引的方法也是中括号,但是python中的切片的使用简化了代码 索引:取出数组s中第3个元素:x=s[2] 切片:用极少的代码将数组元素按需处理的一种方法.切片最少有1个参数,最多有3个参数,演示如下: 我们假设下面所用的数组声明为array=[2,3,4,5,6] 1个参数: array[1:]——从下标为1的元素选择到最后一个元素,返回 [4,5,6] array[:3]——从下标为0的元素选择到下标为2的元素,不包