1、什么是异常
对异常的最好描述是:它是因为程序出现了错误而在正常控制流以外采取的行为。这个行为又分为两个阶段:首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。
标准异常
Python内建异常:
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | python解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
上面三个用的极少 | |
Exception | 常规错误类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零(所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 灭有内建输入,到达EOF标记 |
Environment | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | Windows系统调动失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引 |
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 | 关于被弃用的特征的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
捕获所有异常
python2.5后,有一个’所有异常之母‘,BaseException。KeyboardInterrupt和SystemExit被从Exception里移出和Exception平级。
这样,当你已经有了一个Exception处理器后,你不必为这两个异常创建额外的处理器。代码会是这样:
try:
'''
except Exception, e:
# handle read errors
如果你确实需要捕获所有异常,那么你就得使用新的BaseExcetion:
try:
'''
except BaseException, e:
# handle read errors
TIPS
异常的处理逻辑:发生异常->忽略代码->搜索处理器继续执行->或者抛出异常
不要处理并忽略所有错误
例子
try:
try:
ccfile = open('carddata.txt', 'r')
txns = ccfile.readlines()
except IOError:
log.write('no txns this month\n')
finally:
ccfile.close()
代码片段会尝试打开文件并且读取数据。如果在其中的某步发生一个错误,会写入日志,随后文件被正确的关闭。如果没有错误发生,文件也会被关闭。
try-except-else-finally: 厨房一锅端
try:
try_suite
except Exception1:
suite_for_Exception1
except (Exception2, Exception3, Exception4):
suite_for_Exception_2_3_and_4
except Exception5, Argument5:
suite_for_Exception5_plus_argument
except (Exception6, Exception7), Argument67:
suite_for_Excetions6_and_7_plus_argument
except:
suite_for_all_other_exceptions
else:
no_exceptions_detected_suite
finally:
always_execute_suite
with语句
with保证共享的资源的唯一分配,并在任务结束的时候释放它。比如文件(数据、日志、数据库等等)、线程资源、简单同步、数据库连接,等等。
with context_expr [as var]:
with_suite
触发异常
raise语句
raise [SomeException[, args [, traceback]]]
当然我们还是能够自己创建异常类的。这个这里就不展开了。