异常

异常

异常就是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那就会抛出异常,并且程序的运行随之终止

1.异常的三个部分

  • Traceback 异常的追踪信息
  • ValueError 异常的类型
  • 异常的值

2.异常的错误类型

语法错误:int('aaa')    # ValueError: invalid literal for int() with base 10: 'aaa'

逻辑错误:  for i in 3:print(i)  #TypeError: 'int' object is not iterable

3.异常的强调

强调一: 对于错误发生的条件是可以预知的,此时应该用if判断去预防异常

AGE=10
age = input('>>:').strip()
if age.isdigit(): #通过isdigit方法可以让用户在输入非int类型的时候,不让程序崩溃,进而出现异常
    age=int(age)
    if age > AGE:
        print('太大了')

强调二: 对于错误发生的条件是不可预知的,此时应该用异常处理机制,try...exceot

  • 程序报错后,不会崩溃,会继续执行下面的代码
  • 异常类只能对指定的异常进行处理,对于非指定的异常则无法处理
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='')

    f.close()
except StopIteration:
    print('出错了')

print('>>>1')
print('>>>2')

4.异常的分类

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

2.万能异常: Exception,被监测的代码块抛出的异常有多种可能性,并且我们需要针对所有异常类型,都只有一种的处理逻辑

3.主动出发异常: raise 异常类型(值) 例如:raise TypeError('age必须为int')

4.自定义异常类型

5.断言assert: 未被检测的代码,要依靠被检测代码实行的结果,用到assert

5.异常的种类

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

# 只有在错误一定会发生,无法预知他发生的条件,不能让程序因此崩溃掉

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

# 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)
#     #-----> name 'name' is not defined
#
# except IndexError as e:
#     print('----->',e)
#     #-----> list index out of range
#
# except  KeyError as e:
#     print('----->',e)
#     #-----> 'name'


#万能异常: 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)

# 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)


#其他结构
# 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('在被检测代码块没有发生异常时执行')
#
# finally:
#     print('不管被检测代码块有无发生异常都会执行')


#当涉及到资源回收的时候
# try:
#     f=open('a.txt','r',encoding='utf-8')
#     print(next(f))
#     print(next(f))
#     print(next(f))
#     print(next(f))
#
#     print(next(f))
# finally:
#     f.close()


#主动出发异常: raise 异常类型(值)
# class People:
#     def __init__(self,name,age):
#         if not isinstance(name,str):
#             raise TypeError('名字必须传入str类型')
#         if not isinstance(age,int):
#             raise TypeError('年龄必须传入int类型')
#
#         self.name=name
#         self.age=age
#
# p=People('yang',18)


#自定义异常类型
class MyException(BaseException):
    def __init__(self,msg):
        super(MyException,self).__init__()
        self.msg=msg

    def __str__(self):
        return ('<%s>' %self.msg)

raise  MyException('自己的异常类型')






#断言assert

# info={}
# info['name']='yang'
# info['age']=18

# if 'name' not in info:
#     raise KeyError('必须有name这个key')
#
# if 'age' not in info:
#     raise KeyError('必须有age这个key')

# assert ('name' in info) and ('age' in info)
#
# if info['name'] == 'yang' and info['age'] > 10:
#     print('welcome')

 

原文地址:https://www.cnblogs.com/Mryang123/p/8627227.html