栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

儿童python教程186:Python try except else详解

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

儿童python教程186:Python try except else详解

在 Python 中,还有另一种异常处理结构,就是 try except else 语句,也就是在原来 try except 语句的基础上再添加一个 else 子句,其作用是指定当 try 块中没有发现异常时要执行的代码。换句话说,当 try 块中发现异常,则 else 块中的语句将不会被执行。

例如如下程序:

s = input('请输入除数:')

try:

    result = 20 / int(s)

    print('20除以%s的结果是: %g' % (s , result))

except ValueError:

    print('值错误,您必须输入数值')

except ArithmeticError:

    print('算术错误,您不能输入0')

else:

    print('没有出现异常')

print("程序继续运行")
上面程序为异常处理流程添加了 else 块,当程序中的 try 块没有出现异常时,程序就会执行 else 块。运行上面程序,如果用户输入导致程序中的 try 块出现了异常,则运行结果如下:

请输入除数:a
值错误,您必须输入数值
程序继续运行

如果用户输入让程序中的 try 块顺利完成,则运行结果如下:

请输入除数:3
20 除以3 的结果是:6.66667
没有出现异常
程序继续运行

看到这里,可能有读者觉得奇怪,既然只有当 try 块没有异常时才会执行 else 块,那么直接把 else 块的代码放在 try 块的代码的后面不就行了?

实际上大部分语言的异常处理都没有 else 块,它们确实是将 else 块的代码直接放在 try 块的代码的后面的,因为对于大部分场景而言,直接将 else 块的代码放在 try 块的代码的后面即可。

但 Python 的异常处理使用 else 块绝不是多余的语法,当 try 块没有异常,而 else 块有异常时,就能体现出 else 块的作用了。例如如下程序:

def else_test():

    s = input('请输入除数:')

    result = 20 / int(s)

    print('20除以%s的结果是: %g' % (s , result))

def right_main():

    try:

        print('try块的代码,没有异常')

    except:

        print('程序出现异常')

    else:

        # 将else_test放在else块中

        else_test()

def wrong_main():

    try:

        print('try块的代码,没有异常')

        # 将else_test放在try块代码的后面

        else_test()

    except:

        print('程序出现异常')

wrong_main()

right_main()
上面程序中定义了一个 else_test() 函数,该函数在运行时需要接收用户输入的参数,随着用户输入数据的不同可能导致异常。接下来程序定义了 right_main() 和 wrong_main() 两个函数,其中 right_main() 将 else_test() 函数放在 else 块内;而 wrong_main() 将 else_test() 函数放在 try 块的代码的后面。

正如上面所介绍的,当 try 块和 else 块都没有异常时,将 else_test() 函数放在 try 块的代码的后面和放在 else 块中没有任何区别。例如,如果用户输入的数据没有导致程序出现异常,则将看到程序产生如下输出结果:

try块的代码,没有异常
请输入除数:4
20除以4的结果是: 5
try块的代码,没有异常
请输入除数:4
20除以4的结果是: 5

但如果用户输入的数据让 else_test() 函数出现异常(try 块依然没有任何异常),此时程序就会产生如下输出结果:

try块的代码,没有异常
请输入除数:0
程序出现异常
try块的代码,没有异常
请输入除数:0
Traceback (most recent call last):
  File "C:UsersmengmaDesktop1.py", line 21, in
    right_main()
  File "C:UsersmengmaDesktop1.py", line 12, in right_main
    else_test()
  File "C:UsersmengmaDesktop1.py", line 3, in else_test
    result = 20 / int(s)
ZeroDivisionError: division by zero

对比上面两个输出结果,用户输入的都是 0,这样都会导致 else_test() 函数出现异常。如果将 else_test() 函数放在 try 块的代码的后面,此时 else_test() 函数运行产生的异常将会被 try 块对应的 except 捕获,这正是 Python 异常处理机制的执行流程:但如果将 else_test() 函数放在 else 块中,当 else_test() 函数出现异常时,程序没有 except 块来处理该异常,该异常将会传播给 Python 解释器,导致程序中止。

对比上面两个输出结果,不难发现,放在 else 块中的代码所引发的异常不会被 except 块捕获。

所以,如果希望某段代码的异常能被后面的 except 块捕获,那么就应该将这段代码放在 try 块的代码之后;如果希望某段代码的异常能向外传播(不被 except 块捕获),那么就应该将这段代码放在 else 块中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/805936.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号