zoukankan      html  css  js  c++  java
  • 异常处理

    • 一什么是异常
    • 二异常的种类
    • 三异常处理
    • 四什么时候用异常

    一什么是异常

    1、异常就程序运行时发生错误的信号,在程序出现错误时,若程序没有处理他,则,抛出异常

    ,程序的运行也随之终止。

    2、在python中一个异常信息分为三部分:

    1)异常的追踪信息

    2)异常的类型

    3)异常的值

    3、异常的分类:

      1)语法类异常

       这类的异常应该在程序运行之前就应该被改正。  

     #错误示范
    1
    print('start....') 2 x=1 3 x+=1 4 if #语法错误 5 print('stop....')

      2)逻辑类异常

        这类异常会在程序执行中途被抛出。

     1 #TypeError:int类型不可迭代
     2 for i in 3:
     3     pass
     4 #ValueError
     5 num=input(">>: ") #输入hello
     6 int(num)
     7 
     8 #NameError
     9 aaa
    10 
    11 #IndexError
    12 l=['egon','aa']
    13 l[3]
    14 
    15 #KeyError
    16 dic={'name':'egon'}
    17 dic['age']
    18 
    19 #AttributeError
    20 class Foo:pass
    21 Foo.x
    22 
    23 #ZeroDivisionError:无法完成计算
    24 res1=1/0
    25 res2=1+'str'
    逻辑错误

    二 异常的种类

     在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=input('>>: ').strip() #age='aaa'
    
    if age.isdigit():
        age=int(age)
    
        if age > 10:
            print('too big')
        elif age < 10:
            print('too small')
        else:
            print('you got it')

    如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

    #基本语法为
    try:
        被检测的代码块
    except 异常类型:
        try中一旦检测到异常,就执行这个位置的逻辑
    #举例
    try:
        f=open('a.txt')
        g=(line.strip() for line in f)
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
    except StopIteration:
        f.close()
     1 #1 异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
     2 s1 = 'hello'
     3 try:
     4     int(s1)
     5 except IndexError as e: # 未捕获到异常,程序直接报错
     6     print e
     7 
     8 #2 多分支
     9 s1 = 'hello'
    10 try:
    11     int(s1)
    12 except IndexError as e:
    13     print(e)
    14 except KeyError as e:
    15     print(e)
    16 except ValueError as e:
    17     print(e)
    18 
    19 #3 万能异常Exception
    20 s1 = 'hello'
    21 try:
    22     int(s1)
    23 except Exception as e:
    24     print(e)
    25 
    26 #4 多分支异常与万能异常
    27 #4.1 如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么骚年,大胆的去做吧,只有一个Exception就足够了。
    28 #4.2 如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。
    29 
    30 #5 也可以在多分支后来一个Exception
    31 s1 = 'hello'
    32 try:
    33     int(s1)
    34 except IndexError as e:
    35     print(e)
    36 except KeyError as e:
    37     print(e)
    38 except ValueError as e:
    39     print(e)
    40 except Exception as e:
    41     print(e)
    42 
    43 #6 异常的其他机构
    44 s1 = 'hello'
    45 try:
    46     int(s1)
    47 except IndexError as e:
    48     print(e)
    49 except KeyError as e:
    50     print(e)
    51 except ValueError as e:
    52     print(e)
    53 #except Exception as e:
    54 #    print(e)
    55 else:
    56     print('try内代码块没有异常则执行我')
    57 finally:
    58     print('无论异常与否,都会执行该模块,通常是进行清理工作')
    59 
    60 #7 主动触发异常
    61 try:
    62     raise TypeError('类型错误')
    63 except Exception as e:
    64     print(e)
    65 
    66 #8 自定义异常
    67 class EgonException(BaseException):
    68     def __init__(self,msg):
    69         self.msg=msg
    70     def __str__(self):
    71         return self.msg
    72 
    73 try:
    74     raise EgonException('类型错误')
    75 except EgonException as e:
    76     print(e)
    77 
    78 #9 断言:assert 条件
    79 assert 1 == 1  
    80 assert 1 == 2
    81 
    82 #10 总结try..except
    83 
    84 1:把错误处理和真正的工作分开来
    85 2:代码更易组织,更清晰,复杂的工作任务更容易实现;
    86 3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;

    四 什么时候用异常处理

    只有在错误发生的条件无法预知的情况下,才应该加上try...except

      

  • 相关阅读:
    122. 买卖股票的最佳时机 II-leetcode
    SQL优化
    《C++ Primer Plus》读书笔记之十二—C++中的代码重用
    《C++ Primer Plus》读书笔记之十一—类继承
    《C++ Primer Plus》读书笔记之十—类和动态内存分配
    《C++ Primer Plus》读书笔记之九—使用类
    《C++ Primer Plus》读书笔记之八—对象和类
    一道算法题-换钱
    《C++ Primer Plus》读书笔记之七—内存模型和名称空间
    《C++ Primer Plus》读书笔记之六—函数探幽
  • 原文地址:https://www.cnblogs.com/yangwei666/p/8875494.html
Copyright © 2011-2022 走看看