Python中异常捕捉try..except...finally的使用_try-except语句可以有多个finally子句a对b错-程序员宅基地

技术标签: python异常  try..except..finally  python异常传递  python异常处理  python捕捉异常  系统学python基础原理与应用  

    Python开发中 ,常见错误类型有两种 :语法错误和异常。语法错误是程序没有运行时,由开发IDE环境检测到错误,比如缩进错误,变量没有写完整,缺少:等解析错误。而异常就是指程序运行时检测到的错误,比如ZeroDivisionError,分母为0的错1/0.比如“aaa”+4等错误。

     异常为什么需要处理?1.实际开发中不能直接讲代码的报错抛给用户,而是通过异常处理的形式给出提示。2.如果有异常不处理,程序会挂起,异常后的代码都不会执行。这样影响实际程序的使用。

1.异常演示

#异常类型1:
print("准备open the file")
f1 = open("aaa.txt","r")
print("the file is open")
'''文件不存在,程序报错,是代码形式反馈错误,实际开发给用户体验不好。
准备open the file
    f1 = open("aaa.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: 'aaa.txt'
'''
#异常类型2
num= 5
print(num/0) 
print(num/0) #ZeroDivisionError: division by zero
ZeroDivisionError: division by zero

2.异常处理:python中用 try...except... 捕获异常

1.虽然try....except捕捉了异常 ,程序不会报代码的错误。但是注意异常代码后面的代码不会执行了,可以用try...finally替代。

2.一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。但只有一个分支会被执行,类似else

3.如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之外的代码。

#0.捕捉异常和不捕捉异常的区别在哪里?
num = 5
print(num/0)

print("我是try之外的代码,你猜我会执行吗?哈哈哈")
print("我是try之外的代码,你猜我会执行吗?呵呵呵呵")
-------不捕捉异常的结果,异常代码后面的代码print都不会执行-------------------------------------
Traceback (most recent call last):
  File "D:/pythoyworkspace/file_demo/Class_Demo/Exception_demo.py", line 3, in <module>
    print(num/0)
ZeroDivisionError: division by zero
------------------捕捉异常的代码---------------------------------------------------------
try:
    num = 5
    print(num/0)
except Exception as ex_results:
    print("有情况")
    print("抓了一个异常:",ex_results)
print("我是try之外的代码,你猜我会执行吗?哈哈哈")
==============捕捉异常后代码的执行结果:异常后的代码print会执行=============================
有情况
抓了一个异常: division by zero
我是try之外的代码,你猜我会执行吗?哈哈哈
我是try之外的代码,你猜我会执行吗?呵呵呵
------------------------------------------------------------------------------------------
#1.异常处理:python中用 try...except... 捕获异常
try:  #1.注意代码的缩进,隐患需要处理的代码放到try的缩进代码块里。
    print("准备open the file")
    f1 = open("aaa.txt","r")
    print("the file is open")
except IOError: #except后面跟的是错误类型。
    print("很抱歉:你打开的文件不存在!")  
    #except缩进跟的是处理方式,把处理异常的代码,放在except中。如果没有处理方式可以直接用pass表示什么也不做.

=========================================================================
准备open the file
很抱歉:你打开的文件不存在!

#2.try--except同时处理多个异常类型
try:
    num = 5
    print(num/0)
    print("准备open the file")
    f1 = open("aaa.txt","r")
    print("the file is open")
except(IOError,ZeroDivisionError): #可以同时处理多个异常,各种类型用元组封装
    print("垃圾,程序有异常了")

#3.如果不确定异常类型,可以except后面什么都不写。
try:
    num = 5
    print(num/0)
    print("准备open the file")
    f1 = open("aaa.txt","r")
    print("the file is open")
except:
    print("垃圾,程序有异常了")
#4.打印异常类型,但是实际异常后面的代码不会执行 ,所以只能捕捉一个异常。
try:
    f1 = open("aaa.txt", "r")
    print("the file is open")
    num = 5
    print(num/0)
    print("准备open the file")
except (IOError,ZeroDivisionError) as ex_results: 
    print(ex_results)
=========================================================================
[Errno 2] No such file or directory: 'aaa.txt'

#5.捕捉所有异常,这种情况适合不知道异常具体类型,但是又想存储打印异常类型 。
try:
    num = 5
    print(num/0)
    f1 = open("aaa.txt", "r")
    print("the file is open")
    print("准备open the file")
except Exception as ex_results:
    print("有情况")
    print("抓了一个异常:",ex_results)
print("我是try之外的代码,你猜我会执行吗?哈哈哈")
print("我是try之外的代码,你猜我会执行吗?呵呵呵呵")
==========================================================================
有情况
抓了一个异常: division by zero
我是try之外的代码,你猜我会执行吗?哈哈哈
我是try之外的代码,你猜我会执行吗?呵呵呵呵

#6.try--except可以配上else,类似while else ,for else的使用
try:
    num = input("请输入一个整数除数:")
    result = 100.0/int(num)
    print("商的结果是:%f"%result)
except ZeroDivisionError as ex_results:
    print("有情况")
    print("抓了一个异常:",ex_results)
else :
    print("恭喜,没有 错误")
==========================================================================
请输入一个整数除数:6
商的结果是:16.666667
恭喜,没有 错误
请输入一个整数除数:0
有情况
抓了一个异常: float division by zero

3.异常捕捉:try ..except..finally 

在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等,注意:finally是可选的选项。

#1.try...except....finally的使用演示
try:
    f1 = open("test.txt","rU")
    for i in f1:
        i=i.strip()
        print(i)
except Exception as E_results:
    print("捕捉有异常:",E_results)
finally: #finally的代码是肯定执行的,不管是否有异常,但是finally语块是可选的。
    f1.close
    print("我不管,我肯定要执行。")
------------------程序无异常会执行-----------------------------------
ccccccccccd
ddddddddddddddddd
333343434343
safsdfasdfsadfsa
我不管,我肯定要执行。
------------------程序有异常还是会执行----------------------------------
File "D:/pythoyworkspace/file_demo/Class_Demo/Exception_demo.py", line 44, in <module>
捕捉有异常: [Errno 2] No such file or directory: 'tes2t.txt'
    f1.close
我不管,我肯定要执行。
NameError: name 'f1' is not defined

#2.注意try..finally的使用,可以没有except。只有try...except.,try...except...finally这三种用法

try:
    f1 = open("tes3t.txt","rU")
    for i in f1:
        i=i.strip()
        print(i)
finally: #finally的代码是肯定执行的,不管是否有异常,但是finally语块是可选的。
    print("我不管,我肯定要执行。")
    f1.close
-----------------------有异常的情况 ------------------------------------------------------
 File "D:/pythoyworkspace/file_demo/Class_Demo/Exception_demo.py", line 36, in <module>
恭喜,没有 错误
    f1 = open("tes3t.txt","rU")
我不管,我肯定要执行。
FileNotFoundError: [Errno 2] No such file or directory: 'tes3t.txt'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/pythoyworkspace/file_demo/Class_Demo/Exception_demo.py", line 42, in <module>
    f1.close
NameError: name 'f1' is not defined
--------------------------无异常的情况----------------------------------------------------- 
ccccccccccd
ddddddddddddddddd
333343434343
safsdfasdfsadfsa
我不管,我肯定要执行。

4.异常处理事失败的情况:异常类似错误

try:
    num = 5
    print(num/0) #ZeroDivisionError: division by zero
except IOError:
    print("报错了,分母不能为0")
'''虽然捕捉处理了异常,但是为什么用呢?
print(num/0) #ZeroDivisionError: division by zero
ZeroDivisionError: division by zero
'''
注意:因为异常类型不对,异常类型要很精确的,否则没有用。如果不确定异常类型,可以直接什么都不写
try:
    num = 5
    print(num/0) #ZeroDivisionError: division by zero
except ZeroDivisionError:
    print("报错了,分母不能为0")
-------------------------------------------------------
报错了,分母不能为0

#如果不知道异常是什么类型,可以不写。但是如果写了异常类型,必须是精确的
try:
    num = 5
    print(num/0) #ZeroDivisionError: division by zero
except :
    print("报错了,分母不能为0")
-------------------------------------------------------
报错了,分母不能为0

5.案例演示:异常传递的情况

def test1():
    print("----test1-1----")
    print(num)
    print("----test1-2----")

def test2():
    print("----test2-1----")
    test1()
    print("----test2-2----")

def test3():
    try:
        print("----test3-1----")
        test1()
        print("----test3-2----")
    except Exception as result:
        print("捕获到了异常,信息是:%s" % result)

    print("----test3-3---")
#注意分析执行的结果
test3()
print("------test3执行完了,分割一下-----")
test2()

====================执行结果如下=======================================================
----test3-1----
Traceback (most recent call last):
----test1-1----
  File "D:/pythoyworkspace/file_demo/Class_Demo/Exception_demo.py", line 23, in <module>
    test2()
捕获到了异常,信息是:name 'num' is not defined
----test3-3---

------test3执行完了,分割一下------------
NameError: name 'num' is not defined
----test2-1----
----test1-1----

6.开发中异常处理模式

  • 在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:
try:
    # 尝试执行的代码
    pass
except 错误类型1:
    # 针对错误类型1,对应的代码处理
    pass
except 错误类型2:
    # 针对错误类型2,对应的代码处理
    pass
except (错误类型3, 错误类型4):
    # 针对错误类型3 和 4,对应的代码处理
    pass
except Exception as result:
    # 打印错误信息
    print(result)
else:
    # 没有异常才会执行的代码
    pass
finally:
    # 无论是否有异常,都会执行的代码
    print("无论是否有异常,都会执行的代码")
  • else 只有在没有异常时才会执行的代码
  • finally 无论是否有异常,都会执行的代码

7.异常的传递

  • 异常的传递 —— 当 函数/方法 执行 出现异常,会 将异常传递 给 函数/方法 的 调用一方
  • 如果 传递到主程序,仍然 没有异常处理,程序才会被终止
  • 在开发中,可以在主函数中增加 异常捕获
  • 而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获 中
  • 这样就不需要在代码中,增加大量的 异常捕获,能够保证代码的整洁

需求

  1. 定义函数 demo1() 提示用户输入一个整数并且返回
  2. 定义函数 demo2() 调用 demo1()
  3. 在主程序中调用 demo2()
def demo1():
    return int(input("请输入一个整数:"))


def demo2():
    return demo1()

try:
    print(demo2())
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)

统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26442553/article/details/81780004

智能推荐

kill进程的几种方式_如何kill掉一个进程-程序员宅基地

文章浏览阅读461次。我们会先使用 ps、top 等命令获得进程的 PID,然后使用 kill 命令来杀掉该进程。killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。当然我们可以向进程发送一个终止运行的信号,此时的 kill 命令才是名至实归。,这样结束掉的进程不会进行资源的清理工作,所以如果你用它来终结掉 vim 的进程,就会发现临时文件 *.swp 没有被删除。命令:pid of xx进程,显示进程的进程号,同上pgrep。这是 kill 命令最主要的用法,也是本文要介绍的内容。_如何kill掉一个进程

Python机器学习:如何使用Python实现人工智能算法?_python做ai算法-程序员宅基地

文章浏览阅读1.9k次。在本文中,我们介绍了Python机器学习的一些基本概念和常用库和框架。我们还提供了一些常用的人工智能算法的Python实现示例,例如线性回归、决策树、神经网络等。如果你想深入了解Python机器学习,我们建议你学习更多的机器学习算法和技术,并通过实践来提高你的技能。Python机器学习是一个快速发展的领域,它提供了许多工具和资源,使你可以轻松地构建和部署机器学习模型。无论你是初学者还是有经验的开发者,Python机器学习都是一个值得学习的领域。_python做ai算法

vue elementui 表格数据 时间格式转换_el ui 转换表格字段时间-程序员宅基地

文章浏览阅读5.9k次,点赞4次,收藏20次。vue elementui 表格 中 时间数据格式转换_el ui 转换表格字段时间

Json格式以及常见的Json解析器_json解析工具-程序员宅基地

文章浏览阅读3.6k次。目录什么是JSON?交换数据JSON 语法JSON 语法规则JSON 数据- 名称和值实例JSON 值JSON 数据类型有效的数据类型JSON 字符串实例JSON 数字实例JSON 对象实例JSON 数组实例JSON 布尔实例JSON 对象对象语法实例访问对象值实例嵌套的 JSON 对象实例实例JSON 数组作为 JSON 对象的数组实例JSON 对象中的数组实例_json解析工具

kmeans_kmeans算法相关性分析-程序员宅基地

文章浏览阅读936次。1 kmeansK-means聚类算法也称k均值聚类算法,是集简单和经典于一身的基于距离的聚类算法。它采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。2.算法核心思想K-means聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本_kmeans算法相关性分析

基于springboot的自习室管理系统计算机毕业设计_基于springboot的共享自习室管理系统参考文献-程序员宅基地

文章浏览阅读466次,点赞8次,收藏12次。以上是基于Spring Boot的自习室管理系统的主要功能,通过这些功能可以实现自习室座位的管理、课程的管理、学员信息的管理和行为管理等功能,为自习室提供一个高效、便捷、智能的解决方案。登录后,系统将根据用户的角色显示相应的功能菜单。通过以上各个功能模块的实现,基于Spring Boot的自习室管理系统将提供一套完善的解决方案,帮助自习室提高工作效率和服务质量,为学员提供更加便捷、舒适的学习环境。通过生成相应的报表,管理员可以更好地了解自习室的使用状况和学员的学习情况,从而做出相应的决策和管理调整。_基于springboot的共享自习室管理系统参考文献

随便推点

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

vscode打开markdown文件 不显示图片 预览markdown文件_vscodemarkdown图片无法显示-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏4次。vscode打开markdown文件 不显示图片 预览markdown文件_vscodemarkdown图片无法显示

C++的64位扩展_c++ long64-程序员宅基地

文章浏览阅读516次。在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就是说,常规的32位整数只能够处理40亿以下的数。  那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。不同的编译器对6_c++ long64

C++ 敏感词屏蔽-程序员宅基地

文章浏览阅读350次。首先要解决的问题是敏感词的存储形式,这就涉及数据结构,先想想搜索屏蔽要怎么处理,比如我有一个content,我就遍历它每个字符,先看与词典中所有词第一个字符相同的,再看第二个,再看第三个.等等。那么,很明显,这就需要一种以层来存储的数据结构--树来存储敏感词汇。我首先设计了一个Node,它要存储同一级的node指针,下一级的node指针,标识词的结束,数据。最开始本来只想到用树的结构,最后发现, ...

一种隐私保护的BP神经网络的设计-程序员宅基地

文章浏览阅读167次,点赞3次,收藏7次。1. 背景介绍1.1 隐私保护的重要性在当今的数字时代,个人隐私保护已经成为一个越来越受关注的问题。随着大数据和人工智能技术的快速发展,海量的个人数据被收集和利用,这给个人隐私带来了巨大的风险。如何在利用数据的同时保护个人隐私,已经成为了一个亟待解决的挑战。

Java常用异常包_object常用方法,java常见包;常见异常-程序员宅基地

文章浏览阅读177次。1.clone方法保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。2.getClass方法final方法,获得运行时类型。3.toString方法该方法用得比较多,一般子类都有覆盖。4.finalize方法该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。5.equals方法该方法是非常重..._一般情况下,异常类存放在什么包中

推荐文章

热门文章

相关标签