异常处理

一:异常处理认识:

# 请使用代码自定义一个异常类,并抛出该异常;
# 一:先了解什么是异常: 异常是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,就会跑出异常,并且程序的运行随之终止

# Traceback: 异常的追踪信息
# ValueError:异常的类型
# 异常的值:告诉你异常到底是什么样具体的类型

# 2.错误类型:
# 1.语法错误:在程序执行前就要立刻改正过来
# 2.逻辑错误
#ValueError:类型错误
# num=input(">>: ") #输入hello
# int(num)

 # NameError:   变量名错误,变量名没有定义
# aaa

# IndexError:  #索引错误
# l=['egon','aa']
# l[3]

# KeyError: #访问字典没有的Key
# dic={'name':'egon'}
# dic['age']

# AttributeError: #访问类里面没有的属性
# class Foo:pass
# Foo.x

# ZeroDivisionError: 1/0  #1不能除以0,无法完成计算

#TypeError: #int类型不可迭代,数字不能循环,
# for i in 3:
#     pass

二 异常的种类:

# 在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一种错误
# 常见异常
'''
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
'''

三 异常处理:

强调一: 对于错误发生的条件,如果是可以预知的,从事应该用if判断预防异常
# AGE = 10
# age = input('>>:').strip()
# if age.isdigit():
#     age = int(age)
#     if age > AGE:
#         print('太大了') #这种就是可以去预知的,且还可以去用判断进行预防错误的发生


# 强调二: 错误发生的条件如果是不可预知的,此时应该用异常处理机制,try..except
'''基本语法为
try:
    被检测的代码块
except 异常类型:
    try中一旦检测到异常,就执行这个位置的逻辑'''

# try: #代表检测的意思,检测一下代码的执行
#     f = open('a.txt','r',encoding='utf-8')
#     print(next(f),end='')
#     print(next(f),end='')
#     print(next(f),end='')
#     print(next(f),end='')
#     f.close()  #从文件迭代取信息的时候,无法预知错误发生的条件,而且异常是一定会抛出来的,所以就要去处理
# except  StopIteration:
#     print('出错啦!')

# except:捕捉,上端代码的执行,捕捉异常,
# StopIteration:匹配看是符合什么类型的错误

# 四 try..except...详细用法

 1.多分支:被监测的代码块跑出的异常有多重可能性,并且我们需要针对每一种异常类型都定制专门的处理逻辑


# try:
#     print('===> 1')
#     # name
#     print('===> 2')
#     # l =[1,2,3]
#         l[100]
#     print('===> 3')
#     d ={}
#     d['name']
#     print('===> 4')
#
# except NameError as e:
#     print(e)
# except IndexError as e:
#     print(e)
# except KeyError as e:
#     print(e)

# 2.万能异常Exception
# 被监测的代码块抛出的异常有多种可能性,并且我们针对所有异常类型都只有一种处理逻辑,那就使用 万能异常Exception
# try:
#     print('===> 1')
#     # name
#     print('===> 2')
#     l =[1,2,3]
#     l[100]
#     print('===> 3')
#     d ={}
#     d['name']
#     print('===> 4')
#
# except Exception as e:
#     print('异常发生啦',e)
#
# # 3.异常的其他机构
# try:
#     print('===> 1')
#     # name
#     print('===> 2')
#     l =[1,2,3]
#     l[100]
#     print('===> 3')
#     d ={}
#     d['name']
#     print('===> 4')
# except NameError as e:
#     print(e)
# except IndexError as e:
#     print(e)
# except KeyError as e:
#     print(e)
# except Exception as e:
#     print('统一的处理方法!',e)
# else:
#     print('try内代码块没有异常则执行我')
# finally:
#     print('无论异常与否,都会执行该模块,通常是进行清理工作')
#
#
# # 实例:  针对finally这种异常处理实例:主要还是对回收机制的处理
# try:
#     f = open('a.txt','r',encoding='utf-8')
#     print(next(f),end='')
#     print(next(f),end='')
#     print(next(f),end='')
#     print(next(f),end='')
#
#     print(next(f),end='')
# finally:
#     print('pppp')
#     f.close()  #这里读了五次,第五次没有信息了
#               #出来的结果就是读完文件里的信息之后,将第五次没有督导信息异常给抛出来

==五.主动触发异常:raise 异常类型(值)

class People:
    def __init__(self,name,age):
        if  not isinstance(name,str): #判断name的值是不是str类型
            raise TypeError('名字必须传入str类型')
        if not isinstance(age, int):  # 判断name的值是不是str类型
            raise TypeError('年龄必须传入int类型')
        self.name = name
        self.age = age
# p = People(333,18) #在name传入值得时候,他就传入333,就你管不住,就可以主动触发异常限制传入的name值不能为333
p = People('alex',18) #这样动抛出异常可以限制,传入的值必须是什么类型
# print(p.name)

六.自定义异常

class MyException(BaseException):
    def __init__(self,msg):
        super(MyException,self).__init__()
        self.msg=msg

    def __str__(self):
        return self.msg

raise MyException('我自己的异常类型')
#这一步是异常类型实例化得到的一个对象,他还会做一个打印这个对象的操作print(obj),
# 会触发MyException对象的str方法,所以要想打印变得有意义就要写上 def __str__方法
# raise除了把异常的追踪信息,和异常抛出来以后,还会打印这个对象的操作


# Traceback (most recent call last):
#   File "E:/模块三/考核/3_异常类之抛出异常.py", line 188, in <module>
#     raise MyException('我自己的异常类型')  #print(obj)
# __main__.MyException: 我自己的异常类型

# 为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,
# 如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防
原文地址:https://www.cnblogs.com/sunny7/p/9716499.html