程序中的错误太常见了,这些错误称之为异常,那么当这些错误可能出现的时候,可以使用try语句来捕获这些异常,并且进行相应的一些操作
这样子就不会直接造成程序的奔溃,使其脚本变得更加健壮,之前在写一些异常处理时,我是直接忽略所有的异常,因为在一个某些脚本中循环的操作
可能会带来一些异常,但是一次的异常并不会造成什么影响,所以直接忽略掉进入下一次循环的操作,但是这样子是不好的,看不到异常类型,虽然我也并不需要看。。。
不过还是总结一下python的异常操作处理
1.忽略所有异常且不任何操作
try:
语句块
except:pass
try: print(a) except:pass print 'pass'
a实际上没有定义,会出现一个异常,然而程序正常运行,直接会忽略掉错误,打印pass
像这种情况下是没有任何信息提示的,在调试时就真不能这么用,不然有问题是根本不知道在哪里
2.捕获常规的异常类,且打印错误信息
可以捕获除与程序退出sys.exit()相关之外的所有异常
老版本的Python,except语句写作”except Exception, e”,Python 2.6后应写作”except Exception as e”
try: print(a) except Exception as e: print '错误信息:',e 输出: 错误信息: name 'a' is not defined
try: a = 's'+1 except Exception as e: print '错误信息:',e 输出: 错误信息: cannot concatenate 'str' and 'int' objects
3.当程序未出现错误时执行的语句
try: 语句1 except: 语句2 else: #没有错误可以去做别的事情 语句3
当语句1执行出现了错误那么执行语句2,不执行语句3
当语句1执行未出现错误那么执行语句3,不执行语句2
try: a = 's'+'s' except BaseException as e: print '错误信息:',e else: print('没有出错了执行的程序') 输出: 没有出错了执行的程序
4.不能论程序正确与否都执行的语句
当try中出现错误时,跳过出错后的语句,直接执行finally中的语句
若try中未出现错误,顺序执行下来
try: pass finally: #如果没有捕获到异常。代码执行。 #如果捕获到异常,先执行这个,然后丢给解释器进行处理异常。 #总之就是无论如何都会做这个操作。 pass
try: a = 's'+1 finally: print('无论如何都执行的语句') 输出: 无论如何都执行的语句 Traceback (most recent call last): File "C:/Users/Zss-pc/Desktop/Py/�쳣����/�쳣����.py", line 4, in <module> a = 's'+1 TypeError: cannot concatenate 'str' and 'int' objects
添加一个异常后,再执行finally
try: pass except: # 处理异常 pass finally: # 必须做的事 pass # 1、如果try 没有捕获到异常,执行finally语句。 # 2、如果捕获到了异常先处理异常,然后执行finally
try: a = 's'+1 except BaseException as e: print '错误信息:',e else: print('没有出错,执行的语句') finally: print('无论如何都执行的语句') 输出: 错误信息: cannot concatenate 'str' and 'int' objects 无论如何都执行的语句
5.断言处理
assert断言是声明其布尔值必须为真的判定,用来测试表示式,其返回值为假,就会触发异常,那么在平时测试脚本的编写时,断言就有很大的用处了,譬如:定义一个测试某段程序的,某个功能的函数或者方法,若正确则返回True,若失败则返回False,配合上try语句的异常捕获,和断言的处理,可以很好的处理测试的结果
需要注意的是,assert语句一般用于开发时对程序条件的验证,只有当内置_debug_为True时,assert语句才有效。当Python脚本以-O选项编译成为字节码文件时,assert语句将被移除。
也就是当 assert True 时,此时正常,若为False,那么则引发异常,当发生异常时,可以使用自定义的异常字符串打印出来就可以知道是什么东西错了,用例的运行也就知道了哪里失败了
try: assert len([1,2,3]) >= 5, '列表元素个数小于5' except Exception as e: print e else: print('列表元素个数大于5')
try: a = '' assert type(a) == int, '输入不为整型' except Exception as e: print e else: print('输入为整型')
6.多个异常的处理
只会捕获第一个异常,如果异常没有被第一个except
语句块处理,那么它也许被下一个语句块处理,或者根本不会被处理
try: aa file = open('test.txt', 'rb') except NameError as e: print("An Name error occurred.") raise e except IOError as e: print("An error occurred.") raise e 输出: An Name error occurred. Traceback (most recent call last): File "C:/Users/Zss-pc/Desktop/Py/�쳣����/�쳣����.py", line 8, in <module> raise e NameError: name 'aa' is not defined
或者将其放置在一个元组中
try: a file = open('test.txt', 'rb') except (IOError, NameError) as e: print("An error occurred. {}".format(e.args[-1]))
标准异常类型:
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |