目录

认识异常处理

  1.程序错误的种类

    2.异常的分类

  3.AssertionError(断言assert语句失败)

异常处理的基本语法

  1.异常处理的基本语法

  2.带有分支的异常处理

  3.处理迭代器异常错误

异常处理的其他写法

  1.try ... finally ...

  2.try ... except ... else ...

  3.try ... except ... else ... finally ...

raise:主动抛出异常

  1.关于raise你需要知道

  2.raise的基本语法

自定义异常类

反射

  1.反射类当中的成员

  2.反射模块当中的成员

  3.反射综合案例

认识异常处理

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:异常&反射的更多相关文章

  1. python 异常 反射

    异常 反射 一.异常处理: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError ...

  2. 项目总结10:通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题

    通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题 关键字 springboot热部署  ClassCastException异常 反射 ...

  3. Java基础--反射机制的知识点梳理

    什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法 ...

  4. Python 面向对象(四) 反射及其魔术方法

    反射 reflection 也有人称之为自省 作用: 运行时获取.添加对象的类型定义信息,包括类 内建方法: getattr(object, name[, default])   返回object对象 ...

  5. python学习日记(OOP——反射)

    反射 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! hasattr ...

  6. Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射

    1.封装 类中的私有化:属性的私有化和方法的私有化 会用到私有的这个概念de场景 1.隐藏起一个属性 不想让类的外部调用 2.我想保护这个属性,不想让属性随意被改变 3.我想保护这个属性,不被子类继承 ...

  7. Day8-面向对象进阶&&socket基础

    抽象类 python2中的写法 import abc class Alert(object): '''报警基类''' __metaclass__ = abc.ABCMeta @abc.abstract ...

  8. java基础(9) - 泛型解析

    泛型 定义简单的泛型类 泛型方法 /** * 1.定义一个泛型类 * 在类名后添加类的泛型参数 <T> * 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型 * 2.定义泛型方法 * ...

  9. Python之面向对象四

    面向对象进阶 一.关于面向对象的两个内置函数 isinstance   判断类与对象的关系    isinstance(obj,cls)检查obj是否是类 cls 的对象,返回值是bool值 issu ...

随机推荐

  1. OSCP Learning Notes - Scanning(2)

    Scanning with Metasploite: 1. Start the Metasploite using msfconsole 2. search modules 3.Choose one ...

  2. Ethical Hacking - NETWORK PENETRATION TESTING(9)

    WEP Cracking Packet Injection What if the AP was idle, or had no clients associated with it? In this ...

  3. Python Ethical Hacking - WEB PENETRATION TESTING(1)

    WHAT IS A WEBSITE Computer with OS and some servers. Apache, MySQL ...etc. Cotains web application. ...

  4. 设计模式:observer模式

    目标:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 例子: class Observer //观察者 { public: virtual vo ...

  5. .Net Core in Docker极简入门(上篇)

    目录 前言 开始 环境准备 Docker基础概念 Docker基础命令 Docker命令实践 构建Docker镜像 Dockerfile bulid & run 前言 Docker 是一个开源 ...

  6. Raid0,1,5,10,50

    raid0 就是把多个硬盘合并成1个逻辑盘使用,数据读写时对各硬盘同时操作,不同硬盘写入不同数据,速度快. **最少需要2块硬盘 raid1 同时对2个硬盘读写(同样的数据).强调数据的安全性.损坏一 ...

  7. 动态页面技术(JSP)

    JSP技术 jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> ----- ...

  8. 使用vuex做列表数据过滤

    功能需求 展示一个表格,表格包含选项有" 姓名 年龄 是否显示"三个列表项 是否显示列表项是可操作开关,点击切换打开/关闭 将表格中开关为打开状态的列表项,在另一个表格中显示 需求 ...

  9. OceanBase安装和使用

    链接 https://mp.weixin.qq.com/s?spm=a2c6h.12873639.0.0.41f92c9bH5FL2Y&__biz=MzU3OTc2MDQxNg==&m ...

  10. 机器学习笔记簿 降维篇 PCA 01

    降维是机器学习中十分重要的部分,降维就是通过一个特定的映射(可以是线性的或非线性的)将高维数据转换为低维数据,从而达到一些特定的效果,所以降维算法最重要的就是找到这一个映射.主成分分析(Princip ...