day27:异常&反射
目录
3.AssertionError(断言assert语句失败)
3.try ... except ... else ... finally ...
认识异常处理
1.程序错误的种类
程序错误分为两种:语法错误 和 异常错误
1.语法错误:代码没有按照python规定语法去写,发明创造产生的错误
2.异常错误:在代码语法正确的前提下,程序报错就是异常
2.异常的分类
# IndexError 索引超出序列的范围
# KeyError 字典中查找一个不存在的关键字
# NameError 尝试访问一个不存在的变量
# IndentationError 缩进错误
# AttributeError 尝试访问未知的对象属性
# StopIteration 迭代器没有更多的值
# AssertionError 断言语句(assert)失败
# EOFError 用户输入文件末尾标志EOF(Ctrl+d)
# FloatingPointError 浮点计算错误
# GeneratorExit generator.close()方法被调用的时候
# ImportError 导入模块失败的时候
# KeyboardInterrupt 用户输入中断键(Ctrl+c)
# MemoryError 内存溢出(可通过删除对象释放内存)
# NotImplementedError 尚未实现的方法
# OSError 操作系统产生的异常(例如打开一个不存在的文件)
# OverflowError 数值运算超出最大限制
# ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
# RuntimeError 一般的运行时错误
# SyntaxError Python的语法错误
# TabError Tab和空格混合使用
# SystemError Python编译器系统错误
# SystemExit Python编译器进程被关闭
# TypeError 不同类型间的无效操作
# UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
# UnicodeError Unicode相关的错误(ValueError的子类)
# UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
# UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
# UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类)
# ValueError 传入无效的参数
# ZeroDivisionError 除数为零
3.AssertionError(断言assert语句失败)
什么是断言?
断言就是猜的意思
assert 和 if 之间的区别在于
assert 在断言失败时候,是直接报错,抛出异常,后面的代码直接终止了
if 在判断为False 的时候,不执行代码
assert 3>1
assert 3>1000
print("ok")
异常处理的基本语法
1.异常处理的基本语法
try ... except ...
把有问题的代码放到try这个代码块当中
如果出现了异常,会直接执行except这个代码块中的内容
作用:防止异常抛错,终止程序.
try :
lst = [1,2,3]
print(lst[90])
except:
print("这里有异常错误~")
2.带有分支的异常处理
在说这个之前,先说一个语法:
except + 异常错误类:特指发生在这类异常错误时,要执行的分支
try:
# IndexError
# lst = [1,2,3]
# print(lst[90]) # KeyError
# dic = {}
# print(dic["a"]) # NameError
# print(wangwen) except IndexError:
print("索引超出了范围") except KeyError:
print("字典中没有这个键") except NameError:
print("没有这个变量") except:
print("有异常错误...")
:)看这个结构,有些像 if elif elif else的感觉
3.处理迭代器异常错误
def mygen():
print("start ... ")
yield 1
yield 2
yield 3
return 4 gen = mygen()
try:
res = next(gen)
print(res)
res = next(gen)
print(res)
res = next(gen)
print(res)
res = next(gen)
print(res) except StopIteration as e :
# 为当前异常错误类StopIteration的对象起一个别名叫做e
# 在StopIteration内部有__str__的方法
# 在打印对象时,直接获取生成器中的return的返回值.
print(e)
print("生成器停止迭代")
看到了这段代码,有几个问题需要注意:
1.except StopIteration as e:StopIteration是一个异常错误类,e是错误类对象的别名
2.在StopIteration异常类中,内置了__str__方法,在打印e对象时,可以直接获取到生成器中的return返回值
异常处理的其他写法
1.try ... finally ...
不论代码正确与否,都必须执行的代码放到finally当中.
一报错会终止掉程序,后面的代码不执行
有些必须要走的代码写在finally中
try:
lst = [1,2,3]
print(lst[90])
finally:
print("被触发了..") print(123)
2.try ... except ... else ...
如果try这个代码块没有异常错误,执行else这个分支,反之就不执行
try:
lst = [1,2,3]
print(lst[90])
except:
pass
else:
print("正常执行结束...")
3.try ... except ... else ... finally ...
try内代码块的代码如果有异常,执行except代码块
如果没有异常,执行else代码块
不管有没有异常,最后都要走finally代码块
try:
lst = [1,2,3]
print(lst[90])
except:
print("异常处理222")
else:
print("正常执行结束...")
finally:
print("我被执行了111")
raise:主动抛出异常
关于raise你需要知道
基本格式:raise + 异常错误类 or 异常错误类对象
常见的两个父类:
BaseException 所有异常类的父类(基类,超类)
Exception 常见异常类的父类
raise的基本语法
# 基本语法
try:
raise BaseException # 相当于主动制造出一个错误
except BaseException:
pass # 简写
try:
raise
except:
print("有异常错误")
自定义异常类
定义一个自定义异常类MyException,让此类继承BaseException类
#(了解)系统底层获取行数和文件名的函数( 只有在程序异常时才能触发 )
def return_errorinfo(n):
import sys
f = sys.exc_info()[2].tb_frame.f_back
if n==1:
return str(f.f_lineno) #返回当前行数
elif n == 2:
return f.f_code.co_filename #返回文件名 def get_value(n):
try:
raise
except:
return return_errorinfo(n) class MyException(BaseException):
def __init__(self,num,msg,line,file):
# 错误号
self.num = num
# 错误信息
self.msg = msg
# 错误行号
self.line = line
# 错误文件
self.file = file sex = "雌雄同体"
try:
if sex == "雌雄同体":
# raise + 异常错误类 或者 异常错误类对象
raise MyException(404,"醒醒吧老弟,人类没有雌雄同体~",get_value(1),get_value(2)) except MyException as e:
# 对象.属性
print(e.num)
print(e.msg)
print(e.line)
print(e.file)
反射
概念: 通过字符串去操作类对象或者模块当中的成员(属性或者方法)
class Man():
pass class Woman():
pass class Children(Man,Woman):
skin = "绿色" def eat(self):
print("小孩一下生就拿了两串大腰子出来了") def drink(self):
print("小孩一下生拿了两瓶勇闯天涯出来了") def __suger(self):
print("小孩自个的糖糖是不给别人的...") obj = Children()
1.反射类当中的成员
1.hasattr() 检测对象/类是否有指定的成员
# hasattr() 检测对象/类是否有指定的成员
# 对象
res = hasattr(obj,"skin") # 检测obj对象是否有成员skin
print(res) # 类
res = hasattr(Children,"eat") # 也可以检测类中是否有成员eat
res = hasattr(Children,"__suger") # 私有成员不能访问,所以结果为False
print(res)
2.getattr() 获取对象/类成员的值
# getattr() 获取对象/类成员的值
# 对象
res = getattr(obj,"skin") # 对象反射属性
print(res) # 通过对象反射出来的方法是个绑定方法,不需要在func添加参数,obj会自动传进去
func = getattr(obj,"drink")
func() # 类
# 通过类反射出来的方法是个普通方法,需要添加参数,避免形参实参数量不一致
func = getattr(Children,"eat")
func(1) # 反射的成员不存在时,可以设置一个默认值防止报错
res = getattr(obj,"abcdefg1234","该成员不存在")
print(res)
3.setattr() 设置对象/类成员的值
# 对象
setattr(obj,"eye","白色")
print(obj.eye) # 类
setattr(Children,"sex","女性")
print(Children.sex)
print(obj.sex)
4.delattr() 删除对象/类成员的值
delattr(obj,"eye")
print(obj.eye) # error # 类
delattr(Children,"sex")
Children.sex
2.反射模块当中的成员
import sys
print(sys.modules) # 返回的是系统模块的一个字典 # 获取当前本模块的对象 (通过__main__这个键来获取)
print(sys.modules["__main__"])
# <module '__main__' from '/mnt/hgfs/python31_gx/day27/mymodule4.py'> def func1():
print("我是func1方法") def func2():
print("我是func2方法") def func3():
print("我是func3方法") def func4():
print("我是func4方法")
3.反射综合案例
while True:
selfmodule = sys.modules["__main__"] # 获取当前模块对象
strvar = input("请输入你要反射的方法")
if hasattr(selfmodule,strvar): # 判断当前模块是否有你输入的方法
func = getattr(selfmodule,strvar) # 获取到你输入的方法名
func()
else:
print("没有这个方法")
day27:异常&反射的更多相关文章
- python 异常 反射
异常 反射 一.异常处理: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError ...
- 项目总结10:通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题
通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题 关键字 springboot热部署 ClassCastException异常 反射 ...
- Java基础--反射机制的知识点梳理
什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法 ...
- Python 面向对象(四) 反射及其魔术方法
反射 reflection 也有人称之为自省 作用: 运行时获取.添加对象的类型定义信息,包括类 内建方法: getattr(object, name[, default]) 返回object对象 ...
- python学习日记(OOP——反射)
反射 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! hasattr ...
- Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射
1.封装 类中的私有化:属性的私有化和方法的私有化 会用到私有的这个概念de场景 1.隐藏起一个属性 不想让类的外部调用 2.我想保护这个属性,不想让属性随意被改变 3.我想保护这个属性,不被子类继承 ...
- Day8-面向对象进阶&&socket基础
抽象类 python2中的写法 import abc class Alert(object): '''报警基类''' __metaclass__ = abc.ABCMeta @abc.abstract ...
- java基础(9) - 泛型解析
泛型 定义简单的泛型类 泛型方法 /** * 1.定义一个泛型类 * 在类名后添加类的泛型参数 <T> * 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型 * 2.定义泛型方法 * ...
- Python之面向对象四
面向对象进阶 一.关于面向对象的两个内置函数 isinstance 判断类与对象的关系 isinstance(obj,cls)检查obj是否是类 cls 的对象,返回值是bool值 issu ...
随机推荐
- python发送邮件插件
github链接:https://github.com/573734817pc/SendEmailPlug-in.git 说明: 1.该插件功能为发送邮件. 2.基于python编写. 3.使用的时候 ...
- 通过hmail搭建一个内网测试的邮件服务器
我们测试的软件基本上都是支持邮件功能,如果你的测试环境是在外网的话那还好说,可以直接使用QQ邮箱.163邮箱等.但是如果是测试环境在内网,无法直接访问到外网的时候,搭建一个邮件服务器就很有必 ...
- Static关键字的使用
Static关键字的使用 static关键字的作用: 用来修饰成员变量和方法,被修饰的成员是属于类的,而不单单是属于某个对象的,也就是说,可以不靠对象来调用. 首先我们来介绍类变量 当static修饰 ...
- 软件测试工程师入门——Linux【使用说明书】
先来说一下linux是什么? linux 是一个开源.免费的操作系统,其稳定性.安全性.处理多并发已经得到业界的认可,目前很多中性,大型甚至是巨型项目都在使用linux. linux 内核:redha ...
- OneinStack - 自动编译环境安装脚本
https://oneinstack.com/
- CppUnit使用和源码解析
前言 CppUnit是一个开源的单元测试框架,支持Linux和Windows操作系统,在linux上可以直接进行源码编译,得到动态库和静态库,直接链接就可以正常使用,在Windows上可以使用VC直接 ...
- [日常摘要] -- zookeeper篇
概览 设计目标 是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用 简介 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于Z ...
- 大数据篇:一文读懂@数据仓库(PPT文字版)
大数据篇:一文读懂@数据仓库 1 网络词汇总结 1.1 数据中台 数据中台是聚合和治理跨域数据,将数据抽象封装成服务,提供给前台以业务价值的逻辑概念. 数据中台是一套可持续"让企业的数据用起 ...
- BUUCTF-web Easyweb
从这道题学到了挺多 一打开题目就是登陆页面,遂扫描文件检测是否存在文件泄露 用dirsearch扫出了robots.txt,.DS_Store和其他php.DS_Store没有可用信息(buuoj的题 ...
- Python异常及异常处理
Python异常及异常处理: 当程序运行时,发生的错误称为异常 例: 0 不能作为除数:ZeroDivisionError 变量未定义:NameError 不同类型进行相加:TypeError 异常处 ...