zoukankan      html  css  js  c++  java
  • 异常

    异常

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

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

     

  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/Mryang123/p/8627227.html
Copyright © 2011-2022 走看看