首页 > 其他 > 详细

异常处理

时间:2017-01-01 00:47:28      阅读:226      评论:0      收藏:0      [点我收藏+]

一.错误和异常

在编写程序时,难免会出现错误,而错误一般分为两种

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

语法错误示范 

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

1.2.逻辑错误示范一

1 #用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
2 num=input(">>: ")
3 int(num)

逻辑错误示范二

1 #无法完成计算
2 res1=1/0
3 res2=1+‘str‘

 

2.什么是异常

异常就是在程序运行时发生错误的信号,在Python中,错误触发如下

技术分享

3.Python中的异常种类

在Python中不同的异常可以用不同的类型(Python中统一了类于类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误

 

Python中常见的异常

 1 ‘ArithmeticError‘  # 计算错误,算法错误
 2 ‘AssertionError‘  # 断言错误,常用于测试
 3 
 4 ‘AttributeError‘  #  属性错误
 5 ‘BaseException‘,   # 基本异常
 6 BlockingIOError‘  # 阻塞错误
 7  ‘BrokenPipeError‘  # 管道破裂错误
 8  ‘BufferError‘  # 缓冲区错误
 9  ‘BytesWarning‘,  # 字节警告
10 ‘ChildProcessError‘,  # 子进程错误
11 ‘ConnectionAbortedError‘  #  连接终止错误
12 ‘ConnectionError‘,   # 连接错误
13 ‘ConnectionRefusedError‘  # 连接拒绝错误
14  ‘ConnectionResetError‘,  # 连接重置错误
15 ‘DeprecationWarning‘  #  废弃警告
16 ‘EOFError‘  # 文件终止错误
17 ‘Ellipsis‘  # 省略错误
18  ‘EnvironmentError‘  # 环境错误
19 ‘Exception‘  # 异常
20  ‘False‘  # 假
21 ‘FileExistsError‘  #  文件存在 错误
22 ‘FileNotFoundError‘  # 文件不存在  错误
23  ‘FloatingPointError‘  # 浮点指针错误
24  ‘FutureWarning‘  # 关于构造将来会有改变的警告
25 ‘GeneratorExit‘  # 生成器发生异常来通知退出
26  ‘IOError‘  #输入/输出操作失败
27 ‘ImportError‘  # 导入模块/对象失败
28  ‘ImportWarning‘  # 导入模块/对象警告
29  ‘IndentationError‘,  # 缩进错误
30 ‘IndexError‘  # 索引错误,序列中没有该索引
31 ‘InterruptedError‘  # 被中断的错误
32  ‘IsADirectoryError‘  # 是一个目录错误
33 ‘KeyError‘  # 映射中没有这个键
34  ‘KeyboardInterrupt‘  # 用户终端执行(通常输入的是^c)
35  ‘LookupError‘   # 无效数据查询基类
36  ‘MemoryError‘  # 内存溢出错误
37 ‘NameError‘  # 名字错误
38  ‘None‘  # 空值
39  ‘NotADirectoryError‘  # 不是目录错误
40  ‘NotImplemented‘  #  方法没有实现
41  ‘NotImplementedError‘  # 尚未实现的方法
42 ‘OSError‘  # 操作系统错误
43 ‘OverflowError‘  # 旧的关于自动提升为长整型(long)的警告
44  ‘PendingDeprecationWarning‘  # 关于特性将会被废弃的警告
45  ‘PermissionError‘  # 权限错误
46  ‘ProcessLookupError‘  # 进程获取错误
47  ‘RecursionError‘  # 递归错误
48  ‘ReferenceError‘  # 弱引用试图访问已经垃圾回收了的对象
49 ‘ResourceWarning‘  # 资源警告
50 ‘RuntimeError‘  # 一般运行时的错误
51  ‘RuntimeWarning‘  # 可疑的运行时的行为警告
52  ‘StopAsyncIteration‘  # 停止异步迭代错误
53 ‘StopIteration‘  # 迭代器没有更多的值
54 ,‘SyntaxError‘  #   语法错误
55  ‘SyntaxWarning‘  # 语法警告
56  ‘SystemError‘  # 系统错误
57  ‘SystemExit‘,   # 系统退出
58 ‘TabError‘  # Tab和空格键混用
59  ‘TimeoutError‘  # 时间超时错误
60  ‘True‘  # 真
61  ‘TypeError‘  # 对象类型错误
62  ‘UnboundLocalError‘,   # 访问未初始化的本地变量
63 ‘UnicodeDecodeError‘  # Unicode解码时的错误
64 ‘UnicodeEncodeError‘  # Unicode编码时的错误
65 ‘UnicodeError‘  # Unicode相关的错误
66  ‘UnicodeTranslateError‘  # Unicode转换时的错误
67  ‘UnicodeWarning‘,  # Unicode警告
68  ‘UserWarning‘  # 用户代码生成警告
69 ‘ValueError‘  # 传入无效的cans
70 ‘Warning‘  # 警告的基类
71 ‘WindowsError‘  # 系统调用失败
72  ‘ZeroDivisionError‘  # 除数为0错误
73  ‘__build_class__‘
74 ‘__debug__‘
75 ‘__doc__‘
76 ‘__import__‘,
77 ‘__loader__‘
78 ‘__name__‘
79 ‘__package__‘, 
80 
81 ‘__spec__‘, ‘abs‘, ‘all‘, ‘any‘, ‘ascii‘, ‘bin‘, ‘bool‘, ‘bytearray‘, ‘bytes‘, ‘callable‘, ‘chr‘, ‘classmethod‘, ‘compile‘, ‘complex‘, ‘copyright‘, ‘credits‘, ‘delattr‘, ‘dict‘, ‘dir‘, ‘divmod‘, ‘enumerate‘, ‘eval‘, ‘exec‘, ‘exit‘, ‘filter‘, ‘float‘, ‘format‘, ‘frozenset‘, ‘getattr‘, ‘globals‘, ‘hasattr‘, ‘hash‘, ‘help‘, ‘hex‘, ‘id‘, ‘input‘, ‘int‘, ‘isinstance‘, ‘issubclass‘, ‘iter‘, ‘len‘, ‘license‘, ‘list‘, ‘locals‘, ‘map‘, ‘max‘, ‘memoryview‘, ‘min‘, ‘next‘, ‘object‘, ‘oct‘, ‘open‘, ‘ord‘, ‘pow‘, ‘print‘, ‘property‘, ‘quit‘, ‘range‘, ‘repr‘, ‘reversed‘, ‘round‘, ‘set‘, ‘setattr‘, ‘slice‘, ‘sorted‘, ‘staticmethod‘, ‘str‘, ‘sum‘, ‘super‘, ‘tuple‘, ‘type‘, ‘vars‘, ‘zip

触发异常举例

触发IndexError

技术分享

触发KeyError

技术分享

触发ValueError

技术分享

 

二.异常处理

2.1什么是异常处理?

Python解释器检测到错误,触发异常,也允许程序员自己触发异常

程序员编写特定的代码,专门用来捕捉这个异常,这段代码与程序的逻辑无关,与异常处理有关

如果捕捉成功进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理

2.2为什么要进行异常处理

Python解释器去执行程序,检测到了一个错误,触发异常,在异常触发后且没有处理的情况下,程序就在当前异常处终止,后面的代码就不会运行了,那么谁会去用一个运行着就突然崩溃的软件

所以你必须提供一种异常处理机制来增强你程序的健壮性和容错性

2.3任何进行异常处理?

首先必须知道,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行钱就修正

一.使用if判断式

正常代码示例

# 第一段代码
num1 = input(‘1>>>‘)  # 输入一个字符串试试
int(num1)
# 第二段代码
num2 = input(‘2>>>‘)  # 输入一个字符串试试
int(num2)
# 第三段代码
num3 = input(‘3>>>‘)  # 输入一个字符串试试
int(num1)

使用if判断进行异常处理

num1=input(‘>>: ‘) #输入一个字符串试试
if num1.isdigit():
    int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
elif num1.isspace():
    print(‘输入的是空格,就执行我这里的逻辑‘)
elif len(num1) == 0:
    print(‘输入的是空,就执行我这里的逻辑‘)
else:
    print(‘其他情情况,执行我这里的逻辑‘)

#第二段代码
# num2=input(‘>>: ‘) #输入一个字符串试试
# int(num2)

#第三段代码
# num3=input(‘>>: ‘) #输入一个字符串试试
# int(num3)

‘‘‘
问题一:
使用if的方式我们只为第一段代码加上了异常处理,针对第二段代码,你得重新写一堆if,elif等
第三段,你还得在写一遍,当然了,你说,可以合在一起啊,没错,你合起来看看,你的代码还能被看懂吗???
而这些if,跟你的代码逻辑并无关系,这就好比你在你心爱的程序中到处拉屎,拉到最后,谁都不爱看你的烂代码,为啥,因为可读性差,看不懂

问题二:
第一段代码和第二段代码实际上是同一种异常,都是ValueError,相同的错误按理说只处理一次就可以了,而用if,由于这二者if的条件不同,这只能逼着你重新写一个新的if来处理第二段代码的异常
第三段也一样
‘‘‘

使用if判断进行异常处理

总结:

1.if判断式的异常处理只能是针对某一段代码,对于不同的代码段相同类型的错误你需要写重复的if来进行处理。

2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,那么你代码的可读性就会变得极其的差。

3.这是可以解决异常的,只是存在1,2的问题,所以,不能妄下定论if不能用来异常处理

二:Python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理

2.1 基本语法

try:
    被检测的代码块
except 异常类型:
    try中一旦检测到异常,就执行这个位置的逻辑

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

1 s1 = ‘hello‘
2 try:
3     int(s1)
4 except IndexError as f:
5     print(f)

2.3 多分支

1 s1 = ‘hello‘
2 try:
3     int(s1)
4 except IndexError as f:
5     print(f)
6 except KeyError as f:
7     print(f)
8 except ValueError as f:
9     print(f)

2.4 万能异常,在Python中有一个万能异常,Exception,他可以捕获任意异常,即;

s1 = ‘hello‘
try:
    int(s1)
except Exception as f:
    print(f)

你可能会说既然有万能异常,那么我直接用上面的这种形式就好了,其他异常可以忽略了

你说的没错,但是应该分为两种情况去看

2.4.1。如果你想要的效果是,无论出现什么异常,我们都统一丢弃,或者使用同一段代码逻辑去处理他们,那么,你大胆去做把,只有一个Exception就足够了

1 s1 = ‘hello‘
2 try:
3     int(s1)
4 except Exception as f:
5     print(f)
6 
7 #如果你统一使用Exception,没错,是可以捕捉所有异常,但意味着你在处理所有异常时都使用同一个逻辑去处理(这里说的逻辑即当前expect下面跟的代码块)

2.4.2如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那么就需要用到多分支了

1 s1 = ‘hello‘
2 try:
3     int(s1)
4 except IndexError as f:
5     print(f)
6 except KeyError as f:
7     print(f)
8 except ValueError as f:

2.4.3 也可以在多分支后来一个Exception

 1 s1 = ‘hello‘
 2 try:
 3     int(s1)
 4 except IndexError as f:
 5     print(f)
 6 except KeyError as f:
 7     print(f)
 8 except ValueError as f:
 9     print(f)
10 except Exception as f:
11     print(f)

5.异常的其他机构

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

6 主动触发异常

1 try:
2     raise TypeError(‘类型错误‘)
3 except Exception as f:
4     print(f)

7.自定义异常

 1 class EgonException(BaseException):
 2     def __init__(self,msg):
 3         self.msg = msg 6 
 8 raise EgonException(‘类型错误‘)

8.断言

 1 def test():
 2     ‘一堆逻辑‘
 3     res = 1
 4     return 1
 5 res1 = test()
 6 assert  res1 == 1
 7 # 以下的n多代码要跟res1进行下一步处理
 8 # 如果assert  res1 != 1 就会抛出AssertionError,等同于
 9 if res1 != 1:
10     raise AssertionError

 

异常处理

原文:http://www.cnblogs.com/YingLai/p/6240535.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!