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

    一、什么是异常?

      简而言之异常就是在程序运行中发生的错误信息

        在python中,错误触发的异常如下

      这中错误的信息通常分为两种

        1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)

     1 #语法错误示范一
     2 if
     3 #语法错误示范二
     4 def test:
     5     pass
     6 #语法错误示范三
     7 class Foo
     8     pass
     9 #语法错误示范四
    10 print(haha

        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中常见的异常种类

      常见的异常种类

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

      不常见的种类也很多,在这里就不一一列举了。

    三、异常处理

     在我们遇到一些不可预知的错误,则需要用到try...except:在错误发生之后进行处理

      基本语法为
        try:
            被检测的代码块
        except 异常类型:
            try中一旦检测到异常,就执行这个位置的逻辑
    1 def name():
    2     print("你的名字")
    3     [][1]
    4 try:
    5     print(name())
    6 except IndexError:
    7     print("有异常操作")

      在我们处理异常的时候需要注意一下几点

        1.异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

     1 s = "你的微笑"
     2 try:
     3     print(int(s))
     4 except ValueError as e:
     5     print(e)
     6 # 运行结果 : invalid literal for int() with base 10: '你的微笑'
     7 
     8 try:
     9     print(int(s))
    10 except NameError as e:   # 当异常类型不匹配时,直接报错
    11     print(e)
    12 # 运行结果 : ValueError: invalid literal for int() with base 10: '你的微笑'

        2.多分支

    1 s1 = '月牙湾'
    2 try:
    3     int(s1)
    4 except IndexError as e:
    5     print(e)
    6 except KeyError as e:
    7     print(e)
    8 except ValueError as e:
    9     print(e)

        3.万能异常Exception

     1 def buy():
     2     print("")
     3     name
     4 def look():
     5     print("")
     6     [][1]
     7 def play():
     8     print("")
     9     1/2
    10 def main():
    11     lis = [("",buy),("",look),("",play)]
    12     while True:
    13         for index,content in enumerate(lis,1):
    14             print(index,content[0])
    15         user_input=int(input("请输入序号"))
    16         print(lis[user_input-1])
    17         try:
    18             func = lis[user_input-1][1]
    19             func()
    20         except Exception as e:
    21             print("操作异常:"+str(e.__traceback__.tb_lineno)+""+str(e.args))
    22             print("你在执行%s操作时发生了个异常" %(lis[user_input-1][0]))
    23 main()

        4.当多分之与万能分支一起使用时

    1 try:
    2     pass
    3 except (ValueError,IndentationError):
    4     print("针对性的处理")
    5 except Exception as e:
    6     print(e)
    7     print("通用性的处理")

        5.else 分支 与 finally 分支

     1 s1 = '平静的大海'
     2 try:
     3     int(s1)
     4 except IndexError as e:
     5     print(e)
     6 except KeyError as e:
     7     print(e)
     8 except ValueError as e:
     9     print(e)
    10 #except Exception as e:
    11 #    print(e)
    12 else:
    13     print('try内代码块没有异常则执行我')
    14 finally:
    15     print('无论异常与否,都会执行该模块,通常是进行清理工作')

        6.主动抛出异常

    1 try:
    2     raise TypeError('错误')
    3 except Exception as e:
    4     print(e)

        7.断言:assert 条件

    1 if int(input())==1:
    2     pass
    3 else:
    4     raise AssertionError
    5 # 只有在输入1的时候不会报错,否者抛出错误
    6 
    7 # 通过上述分析 
    8 #assert 1==1  # assert 断言 判断bool类型 只接收 Ture False
    9 # assert 1==2 #AssertionError

        8.自定义异常

     1 # 异常处理
     2 import os
     3 class ExistsError(Exception):   # 自定义一个异常表示当文件不存在时报错
     4     pass
     5 class KeyInvalidError(Exception):    # 自定义一个异常表示当关键字为空时报错
     6     pass
     7 def func(path,prev):            #编写一个函数,用来判断输入的地址是否可以被获取
     8     """
     9     去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者
    10     :param path:
    11     :param prev:
    12     :return:
    13 
    14     """
    15     result = {"code":1000,"data":None}
    16     try:
    17         if not os.path.exists(path):
    18             raise ExistsError()
    19         if not prev:
    20             raise KeyInvalidError()
    21     except ExistsError as e:
    22         result["code"]=1001
    23         result["data"]="文件不存在"
    24     except KeyInvalidError as e:
    25         result["code"] = 1002
    26         result["data"] = "关键字异常"
    27     except Exception as e:
    28         result["code"] = 1003
    29         result["data"] = "文件不存在"
    30     return result
    
    
    
    
    
  • 相关阅读:
    sqlserver 自学笔记 函数实训 学分学期转换函数的设计
    jquery dom操作
    jquery clone方法
    Go开发常见陷阱
    Go 语言从新手到大神:每个人都会踩的五十个坑(转)
    Go文件操作大全
    linux下安装go
    Go 学习笔记
    分布式系统设计系列 -- 基本原理及高可用策略 (转)
    安装Redis图形监控工具---RedisLive
  • 原文地址:https://www.cnblogs.com/qq631243523/p/9518957.html
Copyright © 2011-2022 走看看