处理一个异常
当程序出现错误的时候,但我们还是仍旧希望程序继续运行下去,所以我们尽可能地去对潜在的错误进行捕捉。
在它的报错中有这样一个关键词 FileNotFoundError ,这就是我们要处理的异常类型。 那么开始动手捕捉这个错误,并处理它吧。
?
?
?处理多个异常
如果我的程序在执行某个功能的时候可能会报多种不同的异常,我应该怎么办呢?
首先如果你的多种异常的处理方案是一样的话,我们就能在?except ?这里多写几种异常种类。 它会按照我们正常的执行顺序,依次检测异常,报出第一个遇到的异常。
?
?将v=d["gender"]注释掉后,运行得到:
?try-except-else
还有一个 try-except-else 的模式,在?else ?中处理没有报错的情况,我们对比下面两种写法,一种让它报错,一种不让它报错。 下面的代码,是会报错的代码,我们看到它不会进入到?else 。
下面的代码,我们把?l ?加一个位置,就不会报错了,那么代码就会执行到?else ?阶段。
?
?try-except-finally
如果?else ?是为了执行没有异常的状况,那么?finally ?就是为了执行?不管有没有异常?的情况。 无论有报错还是没报错,finally ?下面的代码都会运行。下面第一段代码是会报错的,第二段不会报错。
?raise手动触发异常?
有天我被调去了做开源库的工作,为了别人使用到我的代码时不至于骂街,或者异常后报出一大堆很难 debug 的信息。 这个时候我就该考虑考虑 raise 的用法了。 为什么这么说?因为 raise 是你为别人犯错留下的证据,或者是告诉别人你怎么犯错的。这个信息对于别人 dubug 你的代码十分有好处。
另一种情况是,你写了成百上千行代码,你也不能全记住代码的每一个细节。所以一旦报错,你也需要一个友善的错误信息提示,这时用 raise 准没错。
?Python异常错误名称表
异常名称 | 描述 |
---|
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 | 用户代码生成的警告 |
|