为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,
1.if进行处理,在错误发生之前进行预防
如果错误发生的条件是可预知的,我们需要用if进行处理,在错误发生之前进行预防
2.用try..except:在错误发生之后进行处理
如果错误发生的条件是不可预知的,则需要用到try..except:在错误发生之后进行处理
到此这篇关于 Python中异常处理用法的文章就介绍到这了。
如果你用 Python 编程,那么你就无法避开异常,因为异常在这门语言里无处不在。打个比方,当你在脚本执行时按 ctrl+c 退出,解释器就会产生一个 KeyboardInterrupt 异常。而 KeyError、ValueError、TypeError 等更是日常编程里随处可见的老朋友。
异常处理工作由“捕获”和“抛出”两部分组成。“捕获”指的是使用 try ... except 包裹特定语句,妥当的完成错误流程处理。而恰当的使用 raise 主动“抛出”异常,更是优雅代码里必不可少的组成部分。
异常分类
BaseException 所有异常的基类Exception 常见错误的基类
ArithmeticError 所有数值计算错误的基类
Warning 警告的基类
AssertError 断言语句(assert)失败
AttributeError 尝试访问未知的对象属性
DeprecattionWarning 关于被弃用的特征的警告
EOFError 用户输入文件末尾标志EOF(Ctrl+d)
FloattingPointError 浮点计算错误
FutureWarning 关于构造将来语义会有改变的警告
GeneratorExit generator.close()方法被调用的时候
ImportError 导入模块失败的时候
IndexError 索引超出序列的范围
KeyError 字典中查找一个不存在的关键字
KeyboardInterrupt 用户输入中断键(Ctrl+c)
MemoryError 内存溢出(可通过删除对象释放内存)
NamerError 尝试访问一个不存在的变量
NotImplementedError 尚未实现的方法
OSError 操作系统产生的异常(例如打开一个不存在的文件)
OverflowError 数值运算超出最大限制
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特征会被遗弃的警告
ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError 一般的运行时错误
RuntimeWarning 可疑的运行行为(runtime behavior)的警告
StopIteration 迭代器没有更多的值
SyntaxError Python的语法错误
SyntaxWarning 可疑的语法的警告
IndentationError 缩进错误
TabError Tab和空格混合使用
SystemError Python编译器系统错误
SystemExit Python编译器进程被关闭
TypeError 不同类型间的无效操作
UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
UnicodeError Unicode相关的错误(ValueError的子类)
UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
UserWarning 用户代码生成的警告
ValueError 传入无效的参数
ZeroDivisionError 除数为零
看下面的两个例子,它们的作用是完全一样的,非常简单,给除数和被除数,计算除法的结果。
这可能是世界上最没用的函数之一,但重点不在这里。重点在于下面的问题:
继续看之前,先考虑一下。给出自己的答案。
Python大师们一般会 「推荐第一种」 使用异常的写法。理由如下:
异常处理的代码是只有发生了异常才会去执行。既然绝大部分情况下不会发生异常,那就没必每次都做事前判断,这样会很浪费CPU的运算力。假设100次调用,只有1次有问题,却要做100次if判断,不浪费吗?
反过来使用异常的方法,只有 出现 了异常才去做处理,那么except语句只会执行一次。
通过这个对比,我们也可以看到:
试想一下,如果我们可以取消做飞机时候的各种事前检查,是不是可以大大提高效率呢?
现实生活中,我们不能取消这种检查。但在程序中,我们可以,因为我们可以用异常捕捉。
现在给大家推荐两条Python异常处理的哲学: