错误和异常
1 错误
从软件层面上来说,错误分为语法错误和逻辑错误,语法错误指示软件的结构上有错误, 导致不能被解释器解释或编译器无法编译. 这些错误必须在程 序执行前纠正。 逻辑错误可能是由于不完整或是不合法的输入 所致; 在其他情况下, 还可能是逻辑无法生成, 计算, 或是输出结果需要的过程无法执行。
2 异常
对异常的好描述是: 它是因为程序出现了错误而在正常控制流以外采取的行为. 这个行为又 分为两个阶段: 首先是引起异常发生的错误, 然后是检测(和采取可能的措施)阶段。
3 Python 中的异常
python中的异常也是一个类,所有的异常都继承自baseexception。每个异常都由三部分组成:traceback,错误名称,错误原因。
4 python中检测和处理异常的机制是try-except语句
如下:
try:
try_suite # watch for exceptions here 监控这里的异常
except Exception[, reason]:
except_suite # exception-handling code 异常处理代码
5 带有多个except的try语句
try:
try_suite
except Exception[, reason]:
except_suite
except Exception1[, reason1]:
suite_for_exception_Exception1
except Exception2[, reason2]:
suite_for_exception_Exception2
6 在python中还可以处理多个异常的except语句, except 语句在处理多个异常时要求异常被放 在一个元组里
except (Exc1[, Exc2[, ... ExcN]])[, reason]:
suite_for_exceptions_Exc1_to_ExcN
7 捕获所有异常
在python中大多数类都继承自exception,所以可以用这个异常捕捉大多数异常:
try:
try_suite
except Exception as e:
except_suite
8 else子句
在 try 范围中没有异常被检测到时,执行 else 子 句
try:
3rd_party_module.function()
except:
log.write("*** caught exception in module\n")
else:
log.write("*** no exceptions caught\n")
9 finally子句
finally 子句是无论异常是否发生,是否捕捉都会执行的一段代码。
下面是 try-except-else-finally 语法的示例:
try:
A
except MyException: B
else: C
finally: D
10 try-except-else-finally:语句
try:
try_suite
except Exception1:
suite_for_Exception1
except (Exception2, Exception3, Exception4):
suite_for_Exceptions_2_3_and_4
except Exception5 as Argument5:
suite_for_Exception5_plus_argument
else:
no_exceptions_detected_suite
finally:
always_execute_suite
11 触发异常
到目前为止,我们所见到的异常都是由解释器引发的.由于执行期间的错误而引发.程序员在编 写 API 时也希望在遇到错误的输入时触发异常,为此,Python 提供了一种机制让程序员明确的触发异 常:这就是 raise 语句。
raise [SomeException [, args [, traceback]]]
第一个参数,SomeExcpetion,是触发异常的名字。
第二个符号为可选的 args(比如参数,值),来传给异常。
12 断言
断言是一句必须等价于布尔真的判定。
断言语句等价于这样的 Python 表达式,如果断言成功不采取任何措施(类似语句),否则触发 AssertionError(断言错误)的异常.assert 的语法如下:
assert expression[, arguments]
下面是我们如何用 try-except 语句捕获 AssertionError 异常:
try:
assert 1 == 0, 'One does not equal zero silly!'
except AssertionError as args:
print '%s: %s' % (args.__class__.__name__, args)
13 创建异常
尽管标准异常集包含的内容已经相当广泛,你还是可以创建自己的异常.一种情况是你想在特定 的标准异常和模块异常中添加额外的信息。
14 为什么用异常
在应用层处理错误的能力近来变得更为重要, 用户已不再是应用程序的的唯一的直接运行者,程序再也不能只是直接的失败或崩溃,如果这样,就会导致无法挽回的损失。
15 异常和sys模块
另一种获取异常信息的途径是通过 sys 模块中 exc_info()函数. 此功能提供了一个 3 元组 (3-tuple)的信息, 多于我们单纯用异常参数所能获得. 让我们看看如何用 sys.exc_info() :
try: ...
float('abc123') ...
except: ...
import sys ...
exc_tuple = sys.exc_info()
我们从 sys.exc_info()得到的元组中是:
- exc_type: 异常类
- exc_value: 异常类的实例
- exc_traceback: 追踪(traceback)对象