Python基础编程之错误和异常
- 概念
- 错误
- 异常
 
- 常见的系统异常
- 异常的解决
- 预防
- 捕捉处理异常
- with语句
 
- 手动抛出异常
- 自定义异常
概念
错误
可以通过代码进行修复;
 
异常
需要提前考虑,设定限制条件;不能通过代码进行修复;
 
常见的系统异常
-  除零异常:ZeroDivisionError 
-  名称异常:NameError 
-  类型异常 
-  索引异常 
-  键异常 
-  值异常 
-  属性异常 
-  迭代器异常 
  
-  系统异常类继承树 
  
异常的解决
系统一开始已经内置了一些特定的应用场景:当我们写代码的过程当中,一旦触发了这个场景,系统内部就会自动的向外界抛出这个问题,也就是我们所谓的异常——则程序被终止执行,软件的崩溃。
预防
添加容错代码;
 但弊端是,容错代码不属于我们主要的业务逻辑:如果容错代码过多,会造成代码混乱,主业务不清晰。
def divide(x,y):
    if y != 0:
        return x
    print("除数不能为0,请仔细检査")
    return 0
    
print(divide(1, 0))
输出:
除数不能为0,请仔细检査
0
捕捉处理异常

# 之后执行第一个异常
try:
    1/0
    print(name)
except ZeroDivisionError as ze:
    print("xxx", ze)
except NameError as ne:
    print("名称错误", ne)
else:
    print("123")
finally:
    print("最后执行的内容,到时候,不管是否会出现异常,都会执行的语句")
输出:
xxx division by zero
最后执行的内容,到时候,不管是否会出现异常,都会执行的语句
# 或写成元组的形式
try:
    # 1/0
    print(name)
except (ZeroDivisionError,NameError) as z:
    print("xxx", z)
else:
    print("123")
finally:
    print("最后执行的内容,到时候,不管是否会出现异常,都会执行的语句")
输出:
xxx name ‘name’ is not defined
最后执行的内容,到时候,不管是否会出现异常,都会执行的语句
# 当不知道是什么异常时,写一个Exception即可
try:
    1/0
    print(name)
except Exception as ze:
    print("xxx", ze)
else:
    print("123")
finally:
    print("最后执行的内容,到时候,不管是否会出现异常,都会执行的语句")
输出:
xxx division by zero
最后执行的内容,到时候,不管是否会出现异常,都会执行的语句
with语句
不管出现了什么异常,最终都要执行一些清理操作,适用于执行某一段代码A之前,进行预处理,执行代码A结束后,进行清理操作。
 

with open("xx. jpg",'r')as f:
    f.readlines()
# 虽然会报错,但是他一定执行了fileclose这个操作,即:
finally:
	print("xxxx")
	f. close()
@contextlib.contextmanager:使用装饰器,让一个生成器变成一个"上下文管理器”
# 利用功能包将生成器变为上下文处理器
import contextlib
@contextlib.contextmanager
def ze():
    try:
        yield
    except ZeroDivisionError as e:
        print("error:",e)
x=1
y=0
with ze():
    x/y
输出:
error: division by zero
手动抛出异常
通过 raise 语句直接抛出相关类型的异常(但必须是BaseException类里的异常)。
 自己设计异常模块:
def set_age(age):
    if age<=0 or age > 200:
        # print("值错误”)
        raise ValueError("值错误")
    else:
        print("给张三的年龄设置为", age)
set_age(-18)
输出:
 
自定义异常
class LessZero(Exception):
    def init (self, msg):
        self.msg = msg
        
    pass
def set_age(age):
    if age<=0 or age > 200:
        # print("值错误”)
        raise LessZero("小于0,错误")
    else:
        print("给张三的年龄设置为", age)
set_age(-18)
输出:
 可以发现是我们设计的自定义异常类型
 
 若要解决报错,将捕获的异常类型改为我们设置的即可:
class LessZero(Exception):
    def init (self, msg):
        self.msg = msg
        
    pass
def set_age(age):
    if age<=0 or age > 200:
        # print("值错误”)
        raise LessZero("小于0,错误")
    else:
        print("给张三的年龄设置为", age)
# set_age(-18)
try:
    set_age(-18)
except LessZero as e:
    print("x", e)
输出:
x 小于0,错误



















