关于自定义异常

关于自定义异常



class ApiException(Exception):
   """ 我的自定义异常 """
   # err_code = ''
   # err_msg = ''

   def __init__(self, err_code=None, err_msg=None):
       """
       :param err_code:
       :param err_msg:
       """
       self.err_code = self.err_code if self.err_code else err_code
       self.err_msg = self.err_msg if self.err_msg else err_msg

   def __str__(self):
       return 'Error: {0} - {1}'.format(self.err_code, self.err_msg)     #__str__(self)会返回一个对象的描述信息


class InvalidCtrlExec(ApiException):
   """ 当参数不合法时触发
   40001  invalid credential 不合法的调用凭证
   """
   err_code = '40001'
   err_msg = '不合法的调用凭证'


class BadPramsException(ApiException):
   """ 参数不正确 """
   err_code = '40002'
   err_msg = '两个参数必须都是整数'


def divide(num1, num2):
   """ 除法的实现 """
   # 两个数必须为整数
   if not isinstance(num1, int) or not isinstance(num2, int):
       raise BadPramsException()
   # 除数不能为0
   if num2 == 0:
       raise ApiException('400000', '除数不能为0')
   return num1 / num2


if __name__ == '__main__':

   try:
       rest = divide(5, '0')
       print(rest)
   except ApiException as err:
       print('出错了')
       print(err)                 #__str__(self)会返回一个对象的描述信息
   # except BadPramsException as e:
   #     print('----------------')
   #     print(e)

---------------------------------------------------------------------------------------------------

老师,我i想问下:

1、我把if后面的注释掉,代码运行结果一样,我知道意思是self.err_code存在的时候self.err_code = self.err_code,不存在的时候self.err_code = err_code,此处的if判断在这里的用意是什么?

http://img1.sycdn.imooc.com//climg/5e747d400907869e04980058.jpg

2、此处我把代码改成如下:为什么不能执行,难道不是把下面的err_code = '40002'
err_msg = '两个参数必须都是整数'  这两个值传上去吗??

self.err_code = self.err_code,self.err_msg = self.err_msg  这种写法是什么意思??

之前学类的时候都是用self.err_code = err_code,self.err_msg = err_msg!!!

http://img1.sycdn.imooc.com//climg/5e747e2f09255e0d05590400.jpg


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学,你好,同学的理解是可以的。视频中的例子:类属性设置的为空字符串,如果不给self.err_code传值,self.err_code为None,则使用类属性err_code的值;如果对self.err_code进行传值则使用传入的值。

若抛出子类异常,注释了父类中的两个类属性,则使用的是子类中定义的两个类属性的值。

http://img1.sycdn.imooc.com//climg/5e76cbc10927a40c06500500.jpg若注释子类中的没有注释父类中的,并且在抛出该异常时没有传递参数,则输出结果为None

http://img1.sycdn.imooc.com//climg/5e76cbeb098c50d806480544.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

好帮手乔木 2020-03-20 18:38:44

同学你好:

1、提高代码的可用性。按照老师的写法,如果类初始化时没有给这两个属性赋值,则直接使用类属性值,反之使用类初始化实例属性时的属性值。

2、

self.err_code = self.err_code

self.err_msg = self.err_msg 

http://img1.sycdn.imooc.com//climg/5e749d3109fbffe904300127.jpg

self.err_msg 和self.err_code是类的属性,不是实例属性。

elf.err_code = err_code

self.err_msg = err_msg

http://img1.sycdn.imooc.com//climg/5e749c88099d999005180060.jpg

中的err_code和err_msg则是实例属性,上面的过程则是对属性进行初始化。

所以输出的错误是None。

同学可以传值参考:

http://img1.sycdn.imooc.com//climg/5e749cd509ca941507320461.jpg

如果我解决了同学的问题,请采纳!学习愉快^_^。

  • 提问者 20夜风来袭 #1
    老师 你的意思我明白了,还是以上面代码为例: 当我这边不传这个类的属性的时候:(我把类属性注释掉) class BadPramsException(ApiException): """ 参数不正确 """ # err_code = '40002' # err_msg = '两个参数必须都是整数' 因为没有类的属性,self.err_code不存在,通过if判断语句变成如下(我缩写一下): class ApiException(Exception): """ 我的自定义异常 """ err_code = '' err_msg = '' def __init__(self, err_code=None, err_msg=None): self.err_code = err_code #因为没有穿类的属性,if判断后 self.err_msg = err_msg 然后我就可以给它传递实例的属性: raise BadPramsException(5,2) 执行效果如下: 出错了 Error: 5 - 2 ------------------------------ 我的理解没问题吧? 老师这边我就有一个疑问了: class ApiException(Exception): """ 我的自定义异常 """ err_code = '' err_msg = '' 这里不是有定义类的属性了吗,err_code = '', err_msg = '' 还是空属性是不会去触发的???
    2020-03-20 20:42:26
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师