06_Python异常处理机制
1.异常概述
1.什么是错误: 错误是指有逻辑或语法等导致一个程序无法正常执行的问题
2.什么是异常: 异常时程序出错时标识的一种状态,程序不会向下执行而转去调用此函数的地方等待处理错误并恢复为正常状态
3.异常的作用: 通知上层调用者有错误产生需要处理,用做信号
4.为什么要有异常处理机制: 在程序调用层数较深时,向主调函数传递错误信息需要层层的返回比较麻烦,所以用异常处理机制
2.异常处理语法
try-except语法: 尝试捕获异常,将程序转为正常状态并继续执行
try:
可能触发异常的语句
except 错误类型1 as 变量1:
异常处理语句1
except 错误类型2 as 变量2:
异常处理语句2
else:
未发生异常时会执行的语句
finally:
无论有无异常都会执行的语句
try-finally语法: finally子句不能省略且不存在except子句,不会改变程序的(正常/异常)状态
try:
可能触发异常的语句
finally:
无论有无异常都会执行的语句
3.完整的异常语法示例
try:
# 提示用户输入一个整数
num = int(input("请输入一个整数:"))
# 使用8除以用户输入的整数并且输出
print("8除以%d的结果是:%.2f" % (num, 8/num))
except ZeroDivisionError:
print("除0错误")
except ValueError:
print("请输入正确的正整数")
except Exception as e:
print("未知错误:%s" % e)
else:
print("尝试成功")
finally:
print("无论有无异常发生必须执行此句")
4.主动抛出异常语句raise
作用: 触发一个错误让程序进入异常状态
语法:
raise 异常类型
或 raise 异常对象
示例:
# 主动抛出异常
def input_password():
# 提示用户输入密码
pwd = input("请输入密码:")
# 判断密码长度>=8,返回用户输入的密码
if len(pwd) >= 8:
return pwd
# 如果<8主动抛出异常
print("主动抛出异常")
# 创建一个异常对象(可以使用错误字符串信息作为参数)
ex = Exception("密码长度不够")
# raise主动抛出异常
raise ex
try:
print(input_password())
except Exception as e:
print(e)
5.异常的传递特性
def fun1():
return int(input("请输入整数: "))
def fun2():
return fun1()
# 利用异常传递性在主程序捕获异常
try:
print(fun2())
except Exception as e:
print("未知错误: %s" % e)
6.自定义异常
class MsgException(BaseException):
def __init__(self, msg):
self.msg = msg
try:
raise MsgException("消息类型错误")
except MsgException as e:
print(e)
7.断言语句assert
作用: 当真值表达式为False时用错误数据创建一个AssertionError类型的错误并进入异常状态
语法
assert 真值表达式
等同于
if 真值表达式 == False:
raise AssertionError(错误数据)
示例1:
# assert断言会终止程序并抛出异常
def test1():
print("模拟大量逻辑处理")
ret = 100
return ret
ret = test1()
assert ret == 1000, "ret变量未使用到"
ret1 = ret + 100
print(ret1)
# 执行结果: AssertionError: ret变量未使用到
示例2:
def get_age():
age = input("请输入年龄: ")
age = int(age)
assert age < 140, "年龄不能大于140岁!"
assert age >= 0, "年龄不能为负数!"
return age
try:
age = get_age()
except AssertionError as err:
print("发生了断言错误,错误对象是: %s" % err)
age = 0
print("您输入的年龄是: %s" % age)
8.异常处理的高级用法-环境管理器(上下文管理器)
with语句实现上下文管理器概述:
1.用于对资源访问的场合,确保使用过程中不管是否发生异常,都会执行必要有"清理"操作,并释放资源
2.with语句与try-finally相似,并不会改变异常状态,常运用于文件打开后自动关闭,线程中锁的自动获取和释放
2.语法: with 表达式1 [as 变量名1], 表达式2 [as 变量名2], ... # as 子句用于绑定表达式创建的对象
示例:
# 打开文件读取文件数据(with来实现关闭文件)
def read_file():
try:
# f = open("abcd.txt")
with open('abcd.txt') as f:
while True:
s = f.readline()
if not s:
break
int(input("请输入任意数字打印下一行: "))
print(s)
print("文件已经关闭")
except IOError:
print("出现异常已经捕获!")
except ValueError:
print("程序已转为正常状态")
read_file()
print("程序结束")
9.环境管理器(上下文管理器)原理剖析
1.内部有__enter__ 和 __exit__方法的类被称为环境管理器,能够用with进行管理的对象必须是环境管理器
2.__enter__ 将在进入with语句时被调用,并返回由as变量管理的对象
3.__exit__ 将在离开with语句时被调用,且可以用参数来判断离开with语句时是否出现异常并做出相应的处理

class FileWriter:
def __init__(self, filename):
self.filename = filename # 此属性用于记住文件名 def writeline(self, s):
'''此方法用于向文件内写入字符串,同时自动添加换行'''
self.file.write(s)
self.file.write('\n') def __enter__(self):
'''此方法用于实现环境管理器'''
self.file = open(self.filename, 'w')
print("已进入__enter__方法,文件打开成功")
return self # 返回值向用于 with中的as 绑定 def __exit__(self, exec_type, exec_value, exec_tb):
'''
exec_type: 为异常类异,没有异常发生时为None
exec_value: 为错误的对象,没有异常时为None
exec_tb: 为错误的traceback对象
'''
self.file.close()
print("文件", self.filename, "已经关闭")
if exec_type is None:
print("退出with时没有发生异常")
else:
print("退出with时,有异常,类型是", exec_type, "错误是", exec_value)
print("__exit__法被调用,已离开with语句") try:
with FileWriter("log.txt") as fw:
while True:
s = input("请输入一行: ")
if s == "exit":
break
if s == "error":
raise ValueError("故意制造的值错误")
fw.writeline(s)
except:
print("有错误发生,已转为正常") print("这是with语句之外,也是程序的最后一条语句")
自定义的类实现环境管理器示例:
10.全部的异常类型
错误类型
| ZeroDivisionError | 除(或取模)零 (所有数据类型) |
| ValueError | 传入无效的参数 |
| AssertionError | 断言语句失败 |
| StopIteration | 迭代器没有更多的值 |
| IndexError | 序列中没有此索引(index) |
| IndentationError | 缩进错误 |
| IOError | 输入/输出操作失败 |
| ImportError | 导入模块/对象失败 |
| NameError | 未声明/初始化对象 (没有属性) |
| AttributeError | 对象没有这个属性 |
| BaseException | 所有异常的基类 |
| SystemExit | 解释器请求退出 |
| KeyboardInterrupt | 用户中断执行(通常是输入^C) |
| Exception | 常规错误的基类 |
| GeneratorExit | 生成器(generator)发生异常来通知退出 |
| StandardError | 所有的内建标准异常的基类 |
| ArithmeticError | 所有数值计算错误的基类 |
| FloatingPointError | 浮点计算错误 |
| OverflowError | 数值运算超出最大限制 |
| EOFError | 没有内建输入,到达EOF 标记 |
| EnvironmentError | 操作系统错误的基类 |
| OSError | 操作系统错误 |
| WindowsError | 系统调用失败 |
| LookupError | 无效数据查询的基类 |
| KeyError | 映射中没有这个键 |
| MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
| UnboundLocalError | 访问未初始化的本地变量 |
| ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
| RuntimeError | 一般的运行时错误 |
| NotImplementedError | 尚未实现的方法 |
| SyntaxError | Python 语法错误 |
| TabError | Tab 和空格混用 |
| SystemError | 一般的解释器系统错误 |
| TypeError | 对类型无效的操作 |
| UnicodeError | Unicode 相关的错误 |
| UnicodeDecodeError | Unicode 解码时的错误 |
| UnicodeEncodeError | Unicode 编码时错误 |
| UnicodeTranslateError | Unicode 转换时错误 |
警告类型
| Warning | 警告的基类 |
| DeprecationWarning | 关于被弃用的特征的警告 |
| FutureWarning | 关于构造将来语义会有改变的警告 |
| OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
| PendingDeprecationWarning | 关于特性将会被废弃的警告 |
| RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
| SyntaxWarning | 可疑的语法的警告 |
| UserWarning | 用户代码生成的警告 |
06_Python异常处理机制的更多相关文章
- Java异常处理机制 try-catch-finally 剖析
Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...
- JAVA 异常处理机制
主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...
- 深入理解java异常处理机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...
- C++学习笔记27:异常处理机制
一.异常处理机制基础 异常的定义 程序中可以检测的运行不正常的情况 异常处理的基本流程 某段程序代码在执行操作时发生特殊情况,引发一个特定的异常 另一段程序代码捕获该异常并处理它 二.异常的引发 th ...
- C++中的异常处理机制
C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作 ...
- 16、java中的异常处理机制
异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...
- Struts——(四)异常处理机制
在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息.利用Stuts我们可以采用两种方式处理异常: 1.编程式异常处理 即我们在Action中调用业务逻辑层对象的方法时, ...
- Java面向对象编程之异常处理机制
一:Java的异常处理机制的优点: 1:把各种不同情况的异常情况分类,使用JAVA类来表示异常情况,这种类被称为异常类.把各种异常情况表示成异常类,可以充分的发挥类的可扩展性和可重用性. 2:异常流程 ...
- Java之异常处理机制
来源:深入理解java异常处理机制 2.Java异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 ...
随机推荐
- PHP基础之排序
前言 之前简单介绍了流程控制,函数,数组等.有兴趣的可以看看. PHP入门之类型与运算符 PHP入门之流程控制 PHP入门之函数 PHP入门之数组 接下来介绍一下排序,排序是将一组数据,依指定的顺序进 ...
- java中threadlocal的理解
[TOC] #java中threadlocal的理解##一.threadlocal的生命周期和ThreadLocalMap的生命周期可以吧TreadLocal看做是一个map来使用,只不过这个map是 ...
- 来自灵魂的拷问——知道什么是SQL执行计划吗?
面试官说:工作这么久了,应该知道sql执行计划吧,讲讲Sql的执行计划吧! 看了看面试官手臂上纹的大花臂和一串看不懂的韩文,吞了吞口水,暗示自己镇定点,整理了一下思绪缓缓的对面试官说:我不会 面试官: ...
- 工作流选型专项,Camunda or flowable or?
1. 名词解释 1.1. BPM Business Process Management,业务流程管理,“通过建模.自动化.管理和优化流程,打破跨部门跨系统业务过程依赖,提高业务效率和效果”. 1.2 ...
- 关于setTimeout的用法注意事项
setTimeout setTimeout的定义:setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. setTimeout的用法:setTimeout(代码片段,执行代码等待的毫 ...
- ES6语法学习(一)-let和const
1.let 和 const 变量提升: 在声明变量或者函数时,被声明的变量和函数会被提升到函数最顶部: 但是如果声明的变量或者函数被初始化了,则会失去变量提升: 示例代码: param2 = &quo ...
- wordpress-技术博客主题推荐
推荐主题 1.WordStar 这个主题是干净的,以博客为中心,设计清晰,简单,直接的排版,可在各种各样的屏幕尺寸可读,适合多种语言. 效果图 还是非常简洁, 基本和CSDN差不多了 除了没有广告以外 ...
- JMeter软件测试工具介绍及基本安装教程
一.工具介绍 (一)简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试 ...
- 手动向Maven本地仓库添加ORACLE ojdbc6jar包
第一步: 把你的oracle中的ojdbc6.jar复制放到D盘首目录 这是我的D:\oracle\product\11.2.0\dbhome_1\jdbc\ D:ojdbc6.jar 但是Maven ...
- 【深度学习】:一门入门3D计算机视觉
一.导论 目前深度学习已经在2D计算机视觉领域取得了非凡的成果,比如使用一张图像进行目标检测,语义分割,对视频当中的物体进行目标跟踪等任务都有非常不错的效果.传统的3D计算机视觉则是基于纯立体几何来实 ...