try…finally与嵌套及自定义异常抛出

try...finally...

try...finally...语句用来表达这样的情况:在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等。

try:

    f = open("log.txt","r")

    a = 10

    b = 0

    ret = a / b

 

#捕获多个类型的异常

except IOError as ex:

    print(ex)

except ZeroDivisionError as ex:

    print(ex)

else:

    print("没有异常,真是happy!")

finally:

    print("无论是否异常发生,都会执行!")

 

import time

try:

    f = open('log.txt')

    try:

        while True:

            content = f.readline()

            if len(content) == 0:

                break

            time.sleep(2)

            print(content)

    except KeyboardInterrupt:

        #如果在读取文件的过程中,产生了异常,那么就会捕获到

        #比如按下了 ctrl+c

        print("捕获到了以外终止异常!")

    finally:

        f.close()

        print('关闭文件')

except:

    print("没有这个文件")

 

test.txt文件中每一行数据打印,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些。在程序运行的时候,按Ctrl+c中断(取消)程序。

我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭。

 

 try嵌套

import time

try:

    f = open('log.txt')

    try:

        while True:

            content = f.readline()

            if len(content) == 0:

                break

            time.sleep(2)

            print(content)

    finally:

        f.close()

        print('关闭文件')

except:

    print("没有这个文件")

 

函数嵌套调用中:

def myDiv(a, b):

    return a / b

 

def test2():

    a = 10

    b = 0

    try:

        ret = myDiv(a, b)

    except:

        print("test02已经捕获到了异常,但是不想处理!")

        #手动上抛异常

        raise

 

def test3():

    try:

        test2()

    except Exception as ex:

        print(ex)

 

#myDiv函数抛出异常

#test02没有处理,异常自动上抛

#test03接收到异常,并处理

#也就是说,异常是跨函数的

test3()

 总结:

  • 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。
  • 如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样。
  • 注意观察上图中,当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行。

 自定义异常抛出

你可以用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类。

下面是一个引发异常的例子:

#自定义异常类

class OutOfRangeException(Exception):

    def __init__(self,errMsg):

        self.msg = errMsg

 

    def __str__(self):

        return self.msg

 

 

class Person(object):

    def __init__(self):

        self.name = None

        self.age = None

 

    def setAge(self,age):

        if age < 0 or age > 100:

            raise  OutOfRangeException("年龄应该在0-100之间!")

        self.age = age

 

    def setName(self,name):

        self.name = name

 

    def __str__(self):

        return "name:{} age:{}".format(self.name,self.age)

 

if __name__ == "__main__":

    person = Person()

    person.setName("Edward")

    person.setAge(80)

    print(person)

try:

    person.setAge(101)

except OutOfRangeException as ex:

    print(ex)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 568. 最大休假天数(DP)

文章目录1. 题目2. 解题1. 题目 力扣想让一个最优秀的员工在 N 个城市间旅行来收集算法问题。 但只工作不玩耍&#xff0c;聪明的孩子也会变傻&#xff0c;所以您可以在某些特定的城市和星期休假。 您的工作就是安排旅行使得最大化你可以休假的天数&#xff0c;但是您需要遵守…

安装数据库windows 安装redmine 详解

时间紧张&#xff0c;先记一笔&#xff0c;后续优化与完善。 近来公司有须要&#xff0c;要找一个项目管理工具&#xff0c;网上看了redmine还不错&#xff0c;终究项目经理选择了它&#xff0c;让我把平台给搭建起来并熟悉其中的功能。搭建的过程中超过了我的预计还破费了点工…

模块概念与使用及注意事项

1 模块概念 模块就是包含了python代码的文本文件&#xff0c;通俗讲&#xff0c;一个py文件就是一个模块。 2 使用模块(import) 比如&#xff0c;我们单独编写了一个模块&#xff0c;命名为mymodule.py&#xff0c;在该模块中我们定义一些函数和类&#xff0c;我们如何在test.…

魔兽世界转服务器显示完成,魔兽世界怀旧服:TAQ变简单了,为什么还是出现了AFK大潮?...

魔兽世界怀旧服在开服一年多以后&#xff0c;即将在2020年12月3日&#xff0c;迎来经典60年代的收官副本-第六阶段纳克萨玛斯大墓地(NAXX)。在差不多的时间段内&#xff0c;魔兽世界正式服也将上线全新的9.0版本-暗影国度。囧王者估计&#xff0c;在即将到来的12月份里面&#…

LeetCode 317. 离建筑物最近的距离(逆向BFS)*

文章目录1. 题目2. 解题2.1 正常思维BFS2.2 逆向思考BFS1. 题目 你是个房地产开发商&#xff0c;想要选择一片空地 建一栋大楼。 你想把这栋大楼够造在一个距离周边设施都比较方便的地方&#xff0c;通过调研&#xff0c;你希望从它出发能在 最短的距离和 内抵达周边全部的建筑…

Ubuntu 运行Asp.net MVC3

1 先通过SVN获取最新版的Asp.net MVC3代码 2 用Monodevelop打开后&#xff0c;进入Web项目的引用,删除标了红色的引用 3 添加引用“System.Web.Mvc.dll”和“System.Web.WebPages.Deployment.dll” 4 重新编译&#xff0c;然后删除Web项目的bin下的“Microsoft.Web.Infrastruct…

LeetCode 431. 将 N 叉树编码为二叉树(递归/层序)

文章目录1. 题目2. 解题2.1 递归2.2 BFS1. 题目 设计一个算法&#xff0c;可以将 N 叉树编码为二叉树&#xff0c;并能将该二叉树解码为原 N 叉树。 一个 N 叉树是指每个节点都有不超过 N 个孩子节点的有根树。 类似地&#xff0c;一个二叉树是指每个节点都有不超过 2 个孩子节…

包概念与__init__注意事项

1.包的概念 为了组织好模块&#xff0c;将多个模块分为一个包。包是python模块文件所在的目录&#xff0c;且该目录下必须存在__init__.py文件。常见的包结构如下&#xff1a; package_a ├── __init__.py ├── module_a1.py └── module_a2.py package_b ├── _…

服务器上有涉密文件,涉密文件保密管理规定

为贯彻落实国家和省、市、区保密局对涉密文件资料管理工作的要求&#xff0c;进一步做好我办涉密文件资料管理&#xff0c;特制定本规定。一、涉密文件的拟制、印刷、传递、承办、借阅、保管、归档、移交和销毁&#xff0c;必须严格履行审批、清点、登记、签收等手续。二、涉密…

服务器文件同步管理

服务器文件同步管理 原文 http://www.cnblogs.com/yanxiaodi/archive/2011/03/21/2296462.html 前几天有台服务器电源坏了&#xff0c;还好数据没有丢。因此必须做好服务器文件内容的备份。服务器主要是用来提供网站服务&#xff0c;带着一个数据库&#xff0c;数据库可以用分发…

LeetCode 774. 最小化去加油站的最大距离(极小极大化 二分查找)

文章目录1. 题目2. 解题1. 题目 假设我们在一条水平数轴上&#xff0c;列表 stations 来表示各个加油站的位置&#xff0c;加油站分别在 stations[0], stations[1], ..., stations[N-1] 的位置上&#xff0c;其中 N stations.length。 现在我们希望增加 K 个新的加油站&…

修改软件服务器json返回数据格式,AngularJS处理服务器端返回的JSON数据的格式问题...

用ng的$http服务发起ajax请求&#xff0c;php返回的JSON数据格式要正确&#xff01;一开始我的php页面是这样返回数据的&#xff1a;if($result){$oid mysqli_insert_id($conn);echo "{msg:succ,oid:$oid}";}else{echo "{msg:error}";}然后总是报错&#…

python编码规范与命名规范

编码规范 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 每行不超过80个字符&#xff0c;Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这个特点. 如果需要, 你可以在表达式外围增加一对额外的圆括号.例如&#xff1a; x (This will build a …

Linux学习笔记(4) - 文件系统

4.1 什么是文件系统 文件系统表示存储在计算机上的文件和目录的数据结构&#xff0c;也可以用于存储文件的分区或磁盘&#xff0c;操作系统通过文件系统可以方便地查询和访问其中所包含的磁盘块。在Linux系统中&#xff0c;每个分区都是一个文件系统&#xff0c;都有自己的目录…

LeetCode 644. 最大平均子段和 II(二分查找)*

文章目录1. 题目2. 解题2.1 暴力超时2.2 二分查找1. 题目 给定一个包含 n 个整数的数组&#xff0c;找到最大平均值的连续子序列&#xff0c;且长度大于等于 k。并输出这个最大平均值。 样例 1: 输入: [1,12,-5,-6,50,3], k 4 输出: 12.75 解释: 当长度为 5 的时候&#xff…

python基础学习总结

1.python历史 Guido 89年圣诞开写 91年编辑器问世 优点与缺点 优点&#xff1a;简单、易学、免费开源、高层语言 可移植、解释、面向对象、扩展 丰富库、规范代码 缺点&#xff1a;运行速度、国内市场小、中文资料少 2.模式&#xff1a;文本、交互、集成开发 程序原理&am…

学生管理系统代码赏析

# 添加、删除、显示学生信息&#xff08;保存&#xff09; # 保存所有学生信息 students {} # 创建 ID 1000 # 控制系统是否退出 flag True # 从文件中读取学生信息 def load_students(): # 加载学生信息从文件中 stu_file open("students.txt",&quo…

LeetCode 527. 单词缩写(Trie树)

文章目录1. 题目2. 解题1. 题目 给定一个由n个不重复非空字符串组成的数组&#xff0c;你需要按照以下规则为每个单词生成最小的缩写。 初始缩写由起始字母省略字母的数量结尾字母组成。若存在冲突&#xff0c;亦即多于一个单词有同样的缩写&#xff0c;则使用更长的前缀代替…

POJ 1523 SPF (割点 点双连通分量)

题意&#xff1a;求出割点以及除去割点后的连通分量的数量(附带求出了点双连通分量(块)) [求割点]对图深度优先搜索&#xff0c;定义DFS(u)为u在搜索树&#xff08;以下简称为树&#xff09;中被遍历到的次序号。定义Low(u)为u或u的子树中能通过非父子边追溯到的最早的节点&…

质数——python代码赏析

一、求&#xff08;2—您输入数字&#xff09;之间的质数&#xff1a; num int(input("请输入您要输入的数字:"))a[] if num 2:a.append(2) elif num >2:for i in range(2,num1):for j in range(2,i):if i %j 0:breakelse:a.append(i)print(a) 二、求2-100之间…