Python学习之路-----异常传递、嵌套与自定义异常

异常嵌套与传递

        if条件语句和while循环语句可以嵌套使用,异常同样可以。下面演示一个基本的例子:

try:
    f = open("1.txt","r")
    try:
        conent = f.read()
        print(conent)
        f.close()
    except NameError as error:
        print("错误:%s" % error)
except FileNotFoundError as error:
    print("错误:%s" % error)


结果:
错误:[Errno 2] No such file or directory: '1.txt'

        从以上的结果分析可以得出:代码在open()的时候就出错了,因此后面的代码不会执行,会直接执行与第一个try处于同一个代码块的except,正好这个异常的类型就是“FileNotFoundError”,因此这个异常被except成功捕获,结果就是这样。但是如果我们把上面代码中的两个异常类型调换一下位置,代码如下的时候,这个异常与指定的拦截类型不符合,就会被传递给Python解释器,最终由解释器来把程序终止。

try:
    f = open("1.txt","r")
    try:
        conent = f.read()
        print(conent)
        f.close()
    except FileNotFoundError as error:
        print("错误:%s" % error)
except NameError as error:
    print("错误:%s" % error)


结果:
    f = open("1.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: '1.txt'

下面再看一个传递的经典例子:

try:
    f = open("1.txt","w")
    try:
       print(a)
    except FileNotFoundError as error:
        print("错误1:%s" % error)
except NameError as error:
    print("错误2:%s" % error)


结果:
错误2:name 'a' is not defined

        外层的try中,代码以写的方式打开一个文件,这没毛病。内层try中变量a不存在,此时出现异常。但是内层try指定的异常类型与实际发生的异常不符合,就会传递到外层的try,正好外层的try指定处理的异常类型就是实际发生的异常类型,因此结果如上所示。

总结:

        异常代码块可以嵌套,当内层代码出现异常,但是指定的异常类型与实际不符合时就会向外层传递。若还不符合再向外层传递,如果最后还是没有找到指定的类型就会由Python解释器处理。


自定义异常

        自定义异常就是定义一个类继承Exception类,然后在出错的位置手动使用raise抛出一个自定义的异常类对象。

class MyException(Exception):
    pass

try:
    phone_num = input("请输入手机号:")

    if phone_num.isdecimal() is False:
        #print("手机号码含非数字")
        raise MyException("手机号码含非数字")
    elif len(phone_num) != 11:
        # print("手机号长度不够")
        raise MyException("手机号长度不够")
except MyException as error:
    print("提示:%s" % error)


结果:
请输入手机号:sgvsdfgsgsgsdgds
提示:手机号码含非数字

关键点:

  • 自定义异常类要继承Exception
  • 类名(参数)就是定义一个类的实例对象
  • raise 对象名,即手动抛出这个异常
        

你可能感兴趣的:(python)