本篇主要讲解一下,try,except和函数结合使用时候的两种情况

1 try,excpt在函数内

众所周知,try,except语句用于捕获异常,增强程序健壮性和稳定性,因为将异常捕获到之后下面的代码还是可以正常执行的,比程序抛出错误好太多。我们来看下面一段代码:

def demo1():
    try:
        print('我正在执行demo1函数')
        raise Exception('查看报错是否返回到函数调用处')
        # int(input('请输入一个整数: '))
    except Exception as result:
        print('我进来了except里')
        # raise result
def demo2():
    return demo1()
try:
    print(demo2())
except ValueError:
    print('请输入正确的整数')
except Exception as result:
    print(f'未知错误{result}')

在这里插入图片描述
打断点之后可以看到代码执行顺序:1 11 15 16 12 输出第一二句 12 16 输出None。可以看出来,代码执行了demo1中的print(‘我正在执行demo1函数’),然后执行了 raise Exception(‘查看报错是否返回到函数调用处’),因为主动抛出了异常,所以自然而然进入到了第6句的异常捕获中,接着执行了第七句。之后回到了函数调用处第12句,此时其实demo1执行完什么都没有return ,所以第12行其实就是return None.然后再次执行demo2函数,就是又在第12行停留一下,再返回到函数调用处第16行,因为demo2中写的return None,所以最终输出的就是demo2执行之后的结果,None。

这里需要注意的是

(1)如果将try, except写在函数内,就要注意,无论是try,还是except里都要写raise。否则一旦出错,函数既没有return什么东西,也没有返回出现的错误,函数调用处接收到的就是None。相当于函数执行了一趟什么都没干。既没返回有用的东西,报错信息也没有返回。
(2)如果将try, except写在函数内,那么执行try中程序报错或者使用raise主动抛出异常,是可以正常进入到except Exception as error里被捕获到的。那么有些人可能会想,那不是废话嘛,try里报错肯定到了except里了啊,但是如果try,except在函数外部,那就不会到except里了。而是回到函数调用处。
在这里插入图片描述
可以看到,当把第8行放开,那么函数执行顺序就是1。11 15。16 12 输出语句之后 12停留一下 16 17。19。20.。就是当执行完demo1之后,demo1把报错返回给了调用函数的地方,也就是说demo2里其实是这样的:return ‘查看报错信息是否返回到了函数调用处’ ,就是demo1抛出来那个result传递给了demo2.然后demo2执行完回到函数调用处第16行,try里出错了,就到了except里,第一个except错误类型不匹配,所以到了第二个except,所以最终将demo1中的报错信息传递给了20行,打印了报错信息。

2 try ,except在函数外

try:
    def demo1():
        print('我正在执行demo1函数')
        raise Exception('查看报错是否返回到函数调用处')
        # int(input('请输入一个整数: '))
except Exception as result:
    print('我进来了except里')
    raise result
def demo2():
    return demo1()
try:
    print(demo2())
except ValueError:
    print('请输入正确的整数')
except Exception as result:
    print(f'未知错误{result}')

在这里插入图片描述
代码执行完第9行直接跳转到了17行,因为当try在函数外部写的时候,异常具有传递性,会直接返回到调用函数处,而不会走except.
然后又返回到了初次调用demo2的地方第21行。因为执行21行的时候会有报错返回,(也是因为有报错所以没有什么都没有返回,返回None说明函数还没报错,什么返回值也没有,就是返回了None。如果连None都没返回说明报错了)所以走到了except里,匹配异常类型后输出了未知错误……

  在各种编程语言进行工作和学习的过程中,都会有一些错误异常,这些错误则以不同的方式去展现出来,但是也有一些编程语言的错误信息无法直接看到,比如html和css,只能通过页面显示的最终结果来判断是否有错误。Python的错误异常在大部分IDE编辑器中则可以直接显示出来,便于开发人员的调试及修改工作,对初学者也比较友好。   Python中包含错误和异常两种情况①,错误主要是常见的语法错误Synta...
在前面   所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题.   异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制.   也许我们已经使用过异常,但是你习惯使用异常了吗?   现在很多软件都是n*365*24小时运行,软件的健壮性至关重要. 本文包括2个大的异常实现概念:C++的标准异常和SEH异常.   C++标准异常:   也许你很高兴看到错误之后的Heap/Stack中对象被释放,可是如果没有呢?    又或者试想一下一个能解决的错误,需要我们把整个程序Kill掉吗?    在《C++标准异常》中我向你
1 为什么用try-except 语句 首先我们来说说,为什么要用try-except 语句。简单来说,为了避免程序意外退出,而需要使用的语句。 首先来看一段代码,你会更加容易理解: try: 1 / 0 except ZeroDivisionError: print('Divided by zero') print('Should reach here') Divided by zero Should reach here 试想一下,如果我们直接用1/0,执行后会出现什
程序运行时有时会遇到错误,导致程序无法正常运行下去,通常程序员会试图预防这种意外。C++异常处理为这种情况提供了一种功能强大而灵活的工具。这里会介绍四种,分别是: • 调用abort()函数及assert()函数 • 调用exit()函数异常捕获机制try…catch… • exception类 一. 调用abort()函数及assert()函数 abort()函数的原型位于头文件cstdlib(或stdlib.h)中,其典型实现是向标准错误流(即cerr使用的错误流)发送abnormal p
一直以来,我对c++的异常捕获功能非常困惑。因为网上几乎99%的关于c++异常捕获的文章给我的感觉就是:c++异常捕获很简单的啦~就是下面这样嘛,如下情景1:try     int a = 5, b = 0, c = 0;     c = a / b;    // 这里异常 catch(...)        // 捕获所有异常     printf_s("Do not do this...
文章目录1. 什么是异常2. try...excpt的使用2.1 语法介绍2.2 执行流程2.3 异常类型的查看3. try...except...else4. try...except...finally 1. 什么是异常 在执行python程序时,会有出现错误的可能。导致出错的原因有一般两种: 语法错误:程序员编的代码不符合python的规范,比如把print成了printf,此种错误一旦出现会导致程序无法正常启动,但是此类错误是可以避免的。 异常异常是指在程序运行的过程中由于用户的非法输入,环
阿里云上部署的Jenkins服务器发送邮件失败:Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF] 非常实用,给力,清晰的操作步骤,马上解决问题!赞赞赞!爱你作者 appium解决报错:ModuleNotFoundError: No modulenamed ‘selenium.webdriver.common.options‘ appium-python-client和selenium版本冲突真的整的我头无语了,版本就没个稳定的呜呜呜呜 阿里云服务器安装pip3 install loguru报错:Could not install packages due to an EnvironmentError 北风之神c: 总结的很全面,写得赞,博主用心了。 此国产日志 https://nb-log-doc.readthedocs.io/zh_CN/latest 使用原生 loggng封装,兼容性和替换性100%。 1、日志能根据级别能够自动变彩色。 2、print自动变彩色。 3、日志和print在pycahrm控制台的输出都自动可以点击跳转到文件和行号。 4、多进程日志切割安全,文件日志写入性能高 。 5、入参简单,能一键自动记录到多种地方。 相比 loguru 有10胜。 pip install nb_log 。 [阿里云使用k8s技术部署微服务] CSDN-Ada助手: 恭喜你这篇博客进入【CSDN月度精选】榜单,全部的排名请看 https://bbs.csdn.net/topics/616884058。