关于在捕获异常中 except 代码块里再自定义抛出异常 raise 的使用问题

关于在捕获异常中 except 代码块里再自定义抛出异常 raise 的使用问题

相关代码:

def __read(self):
   with open(self.students_path, 'r', encoding='utf-8') as f:
       try:
           data = f.read()
       except Exception as e:
           raise e
return json.loads(data)

问题描述:

上面代码使用 try...except 捕获了读取的异常,但是在 except 代码块里又自主抛出一个异常,那在使用这个函数的时候,会不会因为自主抛出的异常而导致程序中断呢?

对 raise 的更多用法不清楚,因为之前课程说 raise 是自主抛出异常,外面需要使用 try...except 来捕获我们自主抛出的异常.

是不是可以理解为 raise 的功能和 return 很相似,只不过 raise 是以错误的形式,返回信息?


请老师解答,谢谢.

正在回答

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

1回答

同学,你好!当程序出现错误,raise可以在指定位置手动抛出异常,根据条件指定异常内容,一旦执行了raise语句,raise后面的语句将不能执行。

raise和return都能使程序终止运行,两者是有区别的,raise后面写的是异常类型,程序是没有返回内容的,代码示例如下:

http://img1.sycdn.imooc.com//climg/6002b1ed09c8143306520608.jpg

return后面写的是方法返回结果,代码示例如下:

http://img1.sycdn.imooc.com//climg/6002b29109d89f3305750572.jpg

祝学习愉快~

  • 科伟 提问者 #1

    上例的代码,课程中的学生信息库读取函数,使用 try 捕获了异常,又把这个异常抛出。
    不是相当于捕获了一个 Exception 异常,然后又自己把这个异常抛出来吗?

    如果是
    try:
        data = f. read()
    except Exception as e:
        print(e)
        return
    是把异常信息打印出来,退出函数

    那使用 raise e
    不是又把这个异常抛出来吗?

    2021-01-16 17:42:39
  • 好帮手慕燕燕 回复 提问者 科伟 #2

    同学,你好!是的,__read()方法是捕获了异常,然后又使用raise抛出了异常,使用了raise,raise后面的语句将终止运行,同学的理解没有问题;同学写的这段代码是打印异常信息,然后return语句退出,假如不使用return语句退出的话,print(e)后面的语句可以继续执行

    祝学习愉快~


    2021-01-16 19:10:27
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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