关于异常类实例的显示方法

关于异常类实例的显示方法

with ...(异常类) as err:

    pass

实际上err是异常类的一个实例

假设该异常类为一个自定义异常类,类中未手动写入__str__方法,程序捕获了异常之后,运行print(err),打印的实际上是抛异常时传入的实参,也即err.arg

例如抛异常的代码为raise MyException('1', '2'),则print(err)的结果为('1', '2')

在类中没有写__str__方法的前提下,为何在一般情况下,打印实例对象的到的结果一般都是<A object at ...内存地址>,而打印异常类的实例对象的结果却是err.arg?其中的机制是什么样的呢?

正在回答

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

3回答

同学你好:

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

raise的用法:

raise [exceptionName [(reason)]]

其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。

如果同学在ApiException类中重写了__str__()方法,那么会将传入的reason的信息进行格式化,反之直接将reason的信息输出,err的类型为<class '__main__.ApiException'>

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


  • 神羅ten徵 提问者 #1
    既然err是ApiException的一个实例对象,那在打印err的时候为何输出的不是<A object at ...>而直接是错误信息呢?
    2019-10-29 18:58:08
  • 好帮手乔木 回复 提问者 神羅ten徵 #2
    同学你好:这个就是raise的用法,我们可以使用raise语句自己触发异常 raise [Exception [ reason ]] 语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,reason 是自已提供的异常参数。这个参数的作用是为自定义的异常类中传参。由于使用reason对这个类进行描述,因此就raise这个reason信息。r类型就是这个类学习愉快^_^.
    2019-10-29 19:13:23
提问者 神羅ten徵 2019-10-29 18:26:44

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

例如以上代码

如果注释第52、53行(即不写__str__方法),执行print(err)的结果为('1', '2'),即为err.args属性的值

而对于一般的直接继承于object的类,在动态中打印实例对象时,一般出现的结果为<A object at ...内存地址>,如下:

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

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

为何对于继承了Exception类的子类,打印其实例对象的结果实际为 实例对象.args属性,而不是像一般的类的实例对象打印结果为<A object at ...内存地址>?其中的机制是什么样的呢?

好帮手乔木 2019-10-27 16:17:21

同学你好:

无法判断同学做的操作具体有哪些。

同学可以提供详细的操作代码和运行的截图。方便我们解决同学的困惑。

学习愉快^_^。

  • 提问者 神羅ten徵 #1
    老师您好,已重新在“回答”中对问题进行了完善,麻烦您再看下,谢谢!
    2019-10-29 18:27:32
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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