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

 


posted @ 2018-08-22 17:12  sado  阅读(165)  评论(0编辑  收藏  举报