面向对象编程之自定义异常处理

面向对象编程之自定义异常处理

自定义异常:

八股文:

实现自定义异常类需要继承 Exception 类或其子类,如果自定义运行时异常类需继承 RuntimeException 类或其子类。 在编码规范上,一般将自定义异常类的类名命名为 XXXException,其中 XXX 用来代表该异常的作用。 自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。

问题1:当写程序的过程中没有预料到异常,但是在交付给用户的过程中发生异常了怎么办?
答:这时候我们需要用到万能异常Exception!!

其他异常结构:

try:

else:
    没发生异常的情况下就走else下面的代码!!
-----用于代码检测,检测代码中没有错误!!

finally:
    不管有没有发生异常,该句话一定会执行!!

主动触发异常:

raise +错误类型!!


问题1:为什么会有主动触发异常这种方式存在
答:有时,程序需要主动抛出异常,因为某些情况下,你需要反馈消息给更上层的调用者,告诉它有一些异常情况发生,
而你抛出异常的地方,没有能力处理它,因此需要向上抛出异常。
这种情况为什么不让系统自己抛出异常呢?
一个原因是上层的调用者本身就希望能够捕获有别于系统异常的自定义异常,二来,有些情况下,程序的逻辑是没有异常的,
但是,从业务角度考虑,的确是一个不寻常的情况,因此需要我们主动抛出异常。

直接上代码!

'''
问题1:当写程序的过程中没有预料到异常,但是在交付给用户的过程中发生异常了怎么办?
答:这时候我们需要用到万能异常Exception!!

其他异常结构:
try:

else:
    没发生异常的情况下就走else下面的代码!!
-----用于代码检测,检测代码中没有错误!!

finally:
    不管有没有发生异常,该句话一定会执行!!

主动触发异常:
raise +错误类型!!
问题1:为什么会有主动触发异常这种方式存在?
答:有时,程序需要主动抛出异常,因为某些情况下,你需要反馈消息给更上层的调用者,告诉它有一些异常情况发生,
而你抛出异常的地方,没有能力处理它,因此需要向上抛出异常。
这种情况为什么不让系统自己抛出异常呢?
一个原因是上层的调用者本身就希望能够捕获有别于系统异常的自定义异常,二来,有些情况下,程序的逻辑是没有异常的,
但是,从业务角度考虑,的确是一个不寻常的情况,因此需要我们主动抛出异常。

'''
class Youtube(BaseException):
    def __init__(self,msg):
        self.msg=msg
    #为什么这里有一个双下划线方法?我试了一下,不用该双下划线方法可以报错!!
    def __str__(self):
        return self.msg
    # def show(self):
    #     return self.msg
name='小李'
d=[1,2,3]
while True:
    try:
        num1=int(input('>>:'))
        num2=int(input('>>:'))
        res=num1+num2
        print(res,name)
        raise Youtube('无法连接到该网站!!')
        #d[3]
        #name.check
    except NameError as e:
        print(e)
        print('有数据没有被定义!!')
    except AttributeError as e:
        print(e)
        print('没有该方法或者属性!!')
    except ValueError as e:
        print(e)
        print('请输入数字!!')
    except Youtube as e:
        print('无法连接到该网站!')
    except Exception as e:
        print('万能错误格式:',e)
    else:
        print('else没有发生异常才会执行!!')
    finally:
        print('finally无论发不发生异常都会执行finally语句下的内容!!')
#自定义一个异常,需要自定义一个函数该函数需要继承BaseException

总结一下:

自定义异常类应该总是继承自内置的 Exception 类, 或者是继承自那些本身就是从 Exception 继承而来的类。 尽管所有类同时也继承自 BaseException ,但你不应该使用这个基类来定义新的异常。BaseException 是为系统退出异常而保留的,比如 KeyboardInterruptSystemExit 以及其他那些会给应用发送信号而退出的异常。 因此,捕获这些异常本身没什么意义。 这样的话,假如你继承 BaseException 可能会导致你的自定义异常不会被捕获而直接发送信号退出程序运行。

在程序中引入自定义异常可以使得你的代码更具可读性,能清晰显示谁应该阅读这个代码。 还有一种设计是将自定义异常通过继承组合起来。在复杂应用程序中, 使用基类来分组各种异常类也是很有用的。它可以让用户捕获一个范围很窄的特定异常

猜你喜欢

转载自blog.csdn.net/qq_46044325/article/details/127111878