异常处理

异常:Bug,出现问题了.
提前干预,提前预防.

网络请求的地方使用的最多.应急处理,预防这种问题.

如果真的产生了,不是让程序停掉,而是让程序给用户一个错误提示,跳过异常继续运行.而不是程序闪退.

预判处理:

如果某些代码很可能出错,就把这些代码放在try里面尝试性的去执行.

当try里面的代码出现异常,会直接执行对应的except的代码.except就是来拦截try里面的异常.

之前都是Python解释器来处理异常,直接报错.先在try就是有人提前帮你处理这些错误了.

except:就是一个拦截异常的作用.

就好比用户输入密码出错了,不能让程序闪退,而是应该给用户提示并继续程序的执行.实际上使用if进行预判处理也可以,但是try是专门来处理代码异常的,所以还是使用专业的处理异常的语法模块.

着重在网络请求的时候使用.
有可能正常执执行,也有可能出现异常.
except去拦截异常


基类:就是父类的意思.
异常类的基类是Exception.真正的最基类是BaseException.

代码不稳定就去try里面执行.

try后面可以跟多个except,但是只会执行某一个.

在使用try的时候,一般后面必须要跟一个except或者finally. else可以写也可以不写.

try:
    f = open('113.txt', 'r')  # 代码出现异常了,立刻就停止运行了,不会继续往下运行.
    # content = f.read()
    # print(content)
    f.close()
    # print(b)

except FileNotFoundError as error:  # 拦截指定类型的异常 as 前面必须指定异常类型
    print(error)
except NameError as error1:  # 拦截指定类型的异常 as 前面必须指定异常类型
    print(error1)
# except Exception as error:  # bug终结者.并且可以拿到错误信息
#     print(error)

# except:  # bug终结者.只有当try里面的代码出错了才会执行.
#     print('代码出错了')


# NameError  命名错误
# FileNotFoundError  文件找不到错误
else:  # 如果try里面的代码没有出错,就执行else里面代码,只能1个,位置只能放到try和finally中间.
    print('如果try里面的代码没有出错,就执行else里面代码')

finally:  # 后面不能接东西.无论try里面有没有异常,都会执行finally里面的代码,只能1个.放到最后
    print('无论try里面有没有异常,都会执行finally里面的代码')

try嵌套,异常冒泡抛出:

当try里面的代码出错后,try内部后续代码不会执行,而是直接执行对应的except里面的代码.

如果try里面的代码出错后,默认应该由当前try对应的except去拦截,如果拦截住,就相当于异常已经消失,如果当前try后面的except无法拦截异常,这个异常就会向外层的try传递,由外层对应的except去拦截.以此类推.一直到Python解释器为止.

异常只会向外层传递,不会向内层传递.(在函数嵌套和try嵌套里面都是这个顺序.)

try:
    f = open('13.txt', 'r')  # 一出错就立刻跳到except里面执行
    print('---------')
    try:
        content = f.read()
        print(content)
        f.close()
        print(a)
    except NameError as error1:  # 这里出错,就在这里拦截
        print('---:%s' % error1)

except FileNotFoundError as error:
    print('提示:%s' % error)

print('后续代码')

# 如果内层函数出现异常,默认由自己处理,如果它没有处理异常,会传到外层的try

自定义异常-raise:

异常抛出的原理:

raise: 关键字 抛出. 表示抛出指定的异常实例对象
raise 抛出异常的实例对象,然后except去拦截这个异常实例对象.
能不能拦截:是要看这个错误是不是这个错误的类创建的.

拦截:判断是不是同一个类造出来的,是,就把这个异常实例对象赋值给error.

先抛出来才能拦截.

 

自定义异常:不用解释器提供异常类.
1> 让异常信息是中文的,让用户也能看懂.更加人性化
2> 提前干预,还没有出错之前就来对问题进行处理.
3> 简化异常处理的流程,批量抛出,一次拦截.

注意: 自定义异常类必须继承Exception类,是为了使用raise的能力.否则会报错误.

try:
    # print(a)
    error_instance = NameError("name 'a' is not define")  # 创建指定异常的实例对象
    print(id(error_instance))  # 2291212287760
    raise error_instance  # 抛出指定的异常实例对象


# except NameError as error:  # 里面写了各种错误类型,根据错误去找是什么样的错误类型.
#     print('提示:%s' % error)  # 实际是一个NameError()类产生的一个实例对象.error实际就是一个错误类型的实例对象. 
#     print(id(error))  # 2291212287760

# error = error_instance  ,实际对应关系.

class PhoneException(Exception):
    # 实际的
    # def __init__(self, name):
    #     self.name = name
    #
    # def __str__(self):
    #     # return 'xxxxxxxxxxxxxxxx'
    #     return self.name
    pass


phone_num = input('手机号:')

try:
    if len(phone_num) != 11:
        # print('号码位数不对')
        raise PhoneException('手机号码位数不对')
    elif phone_num.isdecimal() is False:  # isdecimal():判断是不是数字,返回值是False或者是True
        # print('号码不是纯数字')
        raise PhoneException('手机号码不是纯数字')

except PhoneException as error:
    print(error)


var = 'df'.center(20,'*')  # 输出 : *********df*********
print(var)
posted @ 2019-12-25 16:39  砚台是黑的  阅读(234)  评论(0编辑  收藏  举报