Python 基础之面向对象之异常处理
一.认识异常
1.常用异常报错的错误类型
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 除数为零
2.较常见的报错进行举例
# (1)IndexError 索引超出序列的范围
# lst = [1,2,3,4,5]
# res = lst[999]
# (2)KeyError 字典中查找一个不存在的关键字
dic = {'a':1,'b':2,'c':3}
# print(dic["d"])
# (3)NameError 尝试访问一个不存在的变量
#print(hhh)
# (4)IndentationError 缩进错误
if 5 == 5:
print(55)
# print(444)
# (5)AttributeError 尝试访问位置的对象属性
class MyClass():
a = 5
b = 6
obj = MyClass()
#obj.c
# (6)StopIteration 迭代器没有更多的值
it = iter(range(3))
for i in it:
print(i)
#res = next(it)
# (7)AssertionError 断言语句(assert) 失败
'''
#猜一猜 3大于1 吗? 如果3大于1
# 如果猜错了,直接抛异常
# 一般用在程序测试中
'''
#assert 3<1
"""
if 3<1:
print("成立")
"""
二.异常处理基本语法
#格式:
try:
code1
code2
...
except:
code1
code2
把有可能出现异常的代码放到try这个代码块当中
如果出现了异常错误,直接走execpt这个代码块
1.异常处理基本语法
##例1:
try:
lst = [1, 2, 3, 4]
print(lst[9999]) #因为没有9999的列表所有,所有程序有错误
except:
print("这个程序有错误")
# pass
2.多分支条件的异常处理
execpt + 异常错误类 特指这种异常错误发生时,走该分支
#例2:
try:
#以下(1)(2)(3)一一对应,把一一对应的注释去掉别的将其注释就会到想要的数字程序走
#(1)
# lst = [1,2,3,45,6]
# print(lst[10])
#(2)
# dic = {'a':1}
# print(dic['b'])
#(3)
print(hh)
except IndexError:
#(1)
print("走到这里,说明报的是索引下标越界错误.")
except KeyError:
#(2)
print("走到这里,说明报的是字典的键出现错误")
except:
#(3)
# 条件都不满足,走except分支
print("程序有错误")
3.处理迭代器越界错误
借助异常处理类,接收生成器函数中的return 返回值
##例3:
def mygen():
yield 1
yield 2
return 3
# 实例化生成器函数 产生生成器对象 简称生成器
gen1 = mygen()
try:
res = next(gen1)
res = next(gen1)
res = next(gen1) # yield只有两次,所有第三次调用报错
print(res)
# as 及时用来起名字的,给StopIteration 的类[对象]起名字
except StopIteration as e:
'''
当我们打印对象的时候,触发__str__魔术方法
在StopIteration 这个类当中,自动接收异常return 的返回值
通过打印对象触发__str__方法,进而把返回值打印出来
'''
print(e)
三.主动抛出异常raise
BaseExcepton 是所有异常类的父类(基类,超类) (子类的别名: 衍生类 派生类)
Exception 是所有普通错误处理类的父类
raise + (异常处理类 或 异常处理的对象)
#格式:
try:
raise
except:
pass
#返回时True .Exception 是 BaseException 的子类
res = issubclass(Exception, BaseException)
print(res)
1.raise 语法的基本格式
#完整写法
try:
#必须嵌入在try 这个代码里面使用
raise BaseException
except:
print("这个程序抛出了异常")
#简写写法
'''
try:
raise
except:
print("程序抛出了异常")
'''
2.自定义异常类
# return_errorinfo 必须要依靠异常的形式才能触发获取当前的行号或者文件名
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_info(n):
try:
raise BaseException
except:
return return_errorinfo(n)
#如果想要自定义异常类,必须继承所有异常的父类BaseException
class MyException(BaseException):
def __init__(self, err_num, err_msg, err_line, err_filename):
#打印错误号
self.err_num = err_num
#打印错误信息
self.err_msg = err_msg
#打印错误的行号
self.err_line = err_line
#打印错误文件
self.err_filename = err_filename
human_sex = "中性"
try:
if human_sex == "中性":
raise MyException(1001, "人类没有中性", get_info(1), get_info(2))
except MyException as e:
#打印错误号
print(e.err_num)
#打印错误信息
print(e.err_msg)
#打印错误的行号
print(e.err_line)
#打印错误文件
print(e.err_filename)
3.try ... finally .... 使用
try:
print(name)
#无论是否报错,都会执行finally里面代码块
finally:
pass
如果有一些语句,计算在发送报错的情况也仍然要调用或处理一些逻辑
那么使用finally
#例:
# try:
# print(name)
#
# finally:
# print(123)
# print(456)
try这个代码块如果有错误,不执行else代码中的内容
如果没有报错,那么执行else代码块中的内容
try ... execpt ... else 要配合使用else 不能单独拿出来和try使用.
try ... finally .... 可以配合在一起使用
4.try ... execpt ... else使用
try:
#print(name)
print(123)
except:
pass
else:
print(789)
Python 基础之面向对象之异常处理的更多相关文章
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- Python基础7 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...
- 第八篇:python基础_8 面向对象与网络编程
本篇内容 接口与归一化设计 多态与多态性 封装 面向对象高级 异常处理 网络编程 一. 接口与归一化设计 1.定义 (1)归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了 ...
- 【Python之路】第七篇--Python基础之面向对象及相关
面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查obj是否是类 cls 的对象 class Foo(objec ...
随机推荐
- 「题解」「CF468D」树中的配对
目录 题目大意 思路 源代码 本博客除代码之外,来自 skylee 大佬. 题目大意 一棵\(n(n\le10^5)\)个编号为\(1\sim n\)的点的带边权的树,求一个排列\(p_{1\sim ...
- 「题解」「UOJ-164」「清华集训2015」V
目录 题目 原题目 简要题目 正解 这道题题目简洁新颖,吸引读者阅读兴趣... 题目 原题目 点这里 简要题目 需要你维护长度为n的序列并支持下列操作: 区间加法: 区间赋值: 区间每个 \(a_i\ ...
- plsql 导出oracle数据库
plsql 导出数据库有两个问题,一个是只导出结构,一个是导出表结构加数据这样的,首先人家让我导成sql语句 这不是简单,首先打开PLSQL 一.导出结构 1.然后tools->Export U ...
- 第二次写linux驱动总结
第一次写驱动是在去年,2019年十月份左右.当时是看着韦老师的视频一步步完成的.其中经历了很多error.搭建环境花费了很多精力.时间来到了2020年2月19日星期三,韦老师新视频出来了,我跟着再来了 ...
- scala安装此时不应有 \scala\bin\scala.bat
scala安装目录有空格导致的,不应该有空格
- [蓝桥杯][基础训练]2n皇后问题
Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行 ...
- 吴裕雄 PYTHON 人工智能——基于MASK_RCNN目标检测(5)
import os import sys import numpy as np import tensorflow as tf import matplotlib import matplotlib. ...
- 技术学习的网站 http://www.runoob.com/
菜鸟教程:http://www.runoob.com/ W3C:https://www.w3cschool.cn/tutorial 脚本之家:https://www.jb51.net/
- cmake 的使用
官网教程:https://cmake.org/cmake-tutorial/ 第一个简单的例子 源文件:tutorial.cpp // A simple program that computes t ...
- 排序算法大荟萃——希尔(Shell)排序算法
1.基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为d1的倍数的记录放在同一个组中.先再各族中进行直接插入排序,然后取第二个增量d2<d1重复上述的分组 ...