异常
try & except 块
一旦 try 块中的内容出现了异常,那么 try 块后面的内容会被忽略,Python会寻找 except 里面有没有对应的内容,如果找到,就执行对应的块,没有则抛出这个异常。
查看异常类别:dir(_builtins_)
异常类名 | 描述 | 异常类名 | 描述 |
---|---|---|---|
BaseException | 所有异常的基类 | KeyError | 映射中不存在此键 |
Exception | 常规异常的基类 | NameError | 找不到名字(变量) |
AttributeError | 对象不存在此属性 | SyntaxError | Python语法错误 |
IndexError | 序列中无此索引 | TypeError | 对类型无效的操作 |
IOError | 输入输出操作失败 | ZeroDivisionError | 除(或取模)运算的第二个参数为0 |
KeyboardInterrupt | 用户中断智行(通常输入Ctr-C) | ValueError | 传入无效的参数 |
捕捉不同的错误类型
将except 的值改成 Exception 类,来捕获所有的异常
while True:
try:
...
except Exception:
print "..."
捕指定特定异常值
except (ValueError, ZeroDivisionError):
print "..."
#等同
except ValueError:
print "..."
except ZeroDivisionError:
print "..."
使用 except Exception 时,会捕获所有的 Exception 和它派生出来的子类,但不是所有的异常都是从 Exception 类派生出来的,可能会出现一些不能捕获的情况,因此,更加一般的做法是使用这样的形式:
try:
pass
except:
pass
finally
不管 try 块有没有异常, finally 块的内容总是会被执行,而且会在抛出异常前执行,因此可以用来作为安全保证,比如确保打开的文件被关闭。
try:
print 1 / 0
except ZeroDivisionError:
print 'divide by 0.'
finally:
print 'finally was called.'
#out: divide by 0. finally was called.
警告
出现了一些需要让用户知道的问题,但又不想停止程序,可以使用警告。
在需要的地方用 warnings 中的 warn 函数: warn(msg, WarningType = UserWarning)
想要忽略特定类型的警告,用 warnings 的 filterwarnings 函数:
filterwarnings(action, category)