10
10
11
11
处理程序中的错误没有单一的正确方式。为提供一些持久性服务而设计的程序,例如 Web 服务器 应该对错误健壮,将它们记录到日志中为之后考虑,而且在尽可能长的时间内继续接受新的请求。另一方面,Python 解释器通过立即终止以及打印错误信息来处理错误,便于程序员在错误发生时处理它。在任何情况下,程序员必须决定程序如何对异常条件做出反应。
12
12
13
- 异常是这一节的话题,它为程序的错误处理提供了通用的机制。产生异常是终止程序正常执行流的技巧,发射异常情况产生了的信号 ,并直接返回到用于响应异常情况的程序的封闭部分。Python 解释器每次在检测到语句或表达式错误时抛出异常。用户也可以使用` raise ` 或` assert ` 语句来抛出异常。
13
+ 异常是这一节的话题,它为程序的错误处理提供了通用的机制。产生异常是一种技巧,终止程序正常执行流,发射异常情况产生的信号 ,并直接返回到用于响应异常情况的程序的封闭部分。Python 解释器每次在检测到语句或表达式错误时抛出异常。用户也可以使用` raise ` 或` assert ` 语句来抛出异常。
14
14
15
15
** 抛出异常。** 异常是一个对象实例,它的类直接或间接继承自` BaseException ` 类。第一章引入的` assert ` 语句产生` AssertionError ` 类的异常。通常,异常实例可以使用` raise ` 语句来抛出。` raise ` 语句的通用形式在 [ Python 文档] ( http://docs.python.org/py3k/reference/simple_stmts.html#raise ) 中描述。` raise ` 的最常见的作用是构造异常实例并抛出它。
16
16
@@ -23,7 +23,7 @@ Exception: an error occurred
23
23
24
24
当异常产生时,当前代码块的语句不会继续执行。除非异常被解决了(下面会描述),解释器会直接返回到“读取-求值-打印”交互式循环中,或者在 Python 以文件参数启动的情况下会完全终止。此外,解释器会打印栈回溯,它是结构化的文本块,描述了执行分支中的一系列嵌套的活动函数,它们是异常产生的位置。在上面的例子中,文件名称` <stdin> ` 表示异常由用户在交互式会话中产生,而不是文件中的代码。
25
25
26
- ** 处理异常。** 异常可以使用封闭的` try ` 语句来处理。` try ` 语句有多个子句组成 ,第一个子句以` try ` 开始,剩下的以` except ` 开始。
26
+ ** 处理异常。** 异常可以使用封闭的` try ` 语句来处理。` try ` 语句由多个子句组成 ,第一个子句以` try ` 开始,剩下的以` except ` 开始。
27
27
28
28
``` py
29
29
try :
@@ -48,7 +48,7 @@ handling a <class 'ZeroDivisionError'>
48
48
0
49
49
```
50
50
51
- ` try ` 语句能够处理产生在函数体重的异常 ,函数在` <try suite> ` 中调用。当异常产生时,控制流会直接跳到最近的` try ` 语句的能够处理该异常类型的` <except suite> ` 的主体中。
51
+ ` try ` 语句能够处理产生在函数体中的异常 ,函数在` <try suite> ` 中调用。当异常产生时,控制流会直接跳到最近的` try ` 语句的能够处理该异常类型的` <except suite> ` 的主体中。
52
52
53
53
``` py
54
54
>> > def invert (x ):
@@ -73,7 +73,7 @@ Never printed if x is 0
73
73
74
74
异常对象本身就带有属性,例如在` assert ` 语句中的错误信息,以及有关异常产生处的信息。用户定义的异常类可以携带额外的属性。
75
75
76
- 在第一章中,我们实现了牛顿法来寻找任何函数的零点。下面的例子定义类一个异常类 ,无论何时` ValueError ` 出现,它都返回迭代改进过程中所发现的最佳猜测值。数学错误(` ValueError ` 的一种)在` sqrt ` 在负数上调用时产生。这个异常由抛出` IterImproveError ` 处理,它将牛顿迭代法的最新猜测值储存为参数。
76
+ 在第一章中,我们实现了牛顿法来寻找任何函数的零点。下面的例子定义了一个异常类 ,无论何时` ValueError ` 出现,它都返回迭代改进过程中所发现的最佳猜测值。数学错误(` ValueError ` 的一种)在` sqrt ` 在负数上调用时产生。这个异常由抛出` IterImproveError ` 处理,它将牛顿迭代法的最新猜测值储存为参数。
77
77
78
78
首先,我们定义了新的类,继承自` Exception ` 。
79
79
@@ -83,7 +83,7 @@ Never printed if x is 0
83
83
self .last_guess = last_guess
84
84
```
85
85
86
- 下面,我们定义了` IterImprove ` 的一个版本,我们的通用迭代改进算法 。这个版本通过抛出` IterImproveError ` 异常,储存最新的猜测值来处理任何` ValueError ` 。像之前一样,` iter_improve ` 接受两个函数作为参数,每个函数都接受单一的数值参数。` update ` 函数返回新的猜测值,而` done ` 函数返回布尔值,表明改进是否收敛到了正确的值。
86
+ 下面,我们定义了` IterImprove ` ,我们的通用迭代改进算法的一个版本 。这个版本通过抛出` IterImproveError ` 异常,储存最新的猜测值来处理任何` ValueError ` 。像之前一样,` iter_improve ` 接受两个函数作为参数,每个函数都接受单一的数值参数。` update ` 函数返回新的猜测值,而` done ` 函数返回布尔值,表明改进是否收敛到了正确的值。
87
87
88
88
``` py
89
89
>> > def iter_improve (update , done , guess = 1 , max_updates = 1000 ):
@@ -97,7 +97,7 @@ Never printed if x is 0
97
97
raise IterImproveError(guess)
98
98
```
99
99
100
- 最后,我们定义了` find_root ` ,它返回` iter_improve ` 的结果。` iter_improve ` 应用于由` newton_update ` 返回的牛顿更函数 。` newton_update ` 定义在第一章,在这个例子中无需任何改变。` find_root ` 的这个版本用过返回它的最后一个猜测之来处理 ` IterImproveError ` 。
100
+ 最后,我们定义了` find_root ` ,它返回` iter_improve ` 的结果。` iter_improve ` 应用于由` newton_update ` 返回的牛顿更新函数 。` newton_update ` 定义在第一章,在这个例子中无需任何改变。` find_root ` 的这个版本通过返回它的最后一个猜测之来处理 ` IterImproveError ` 。
101
101
102
102
``` py
103
103
>> > def find_root (f , guess = 1 ):
@@ -109,14 +109,14 @@ Never printed if x is 0
109
109
return e.last_guess
110
110
```
111
111
112
- 考虑一下使用 ` find_root ` 来寻找` 2 * x ** 2 + sqrt(x) ` 的零点。这个函数的一个零点是` 0 ` ,但是在任何负数上求解它会产生` ValueError ` 。我们第一章的牛顿法实现会产生异常,并且不能返回任何零点的猜测值。我们的修订版实现在错误之前返回了最新的猜测值。
112
+ 考虑使用 ` find_root ` 来寻找` 2 * x ** 2 + sqrt(x) ` 的零点。这个函数的一个零点是` 0 ` ,但是在任何负数上求解它会产生` ValueError ` 。我们第一章的牛顿法实现会产生异常,并且不能返回任何零点的猜测值。我们的修订版实现在错误之前返回了最新的猜测值。
113
113
114
114
``` py
115
115
>> > from math import sqrt
116
116
>> > find_root(lambda x : 2 * x* x + sqrt(x))
117
117
- 0.030211203830201594
118
118
```
119
119
120
- 虽然这个近似值仍旧距离正确的答案` 0 ` 很远,一些应用更倾向于这个近似而不是 ` ValueError ` 。
120
+ 虽然这个近似值仍旧距离正确的答案` 0 ` 很远,一些应用更倾向于这个近似值而不是 ` ValueError ` 。
121
121
122
122
异常是另一个技巧,帮助我们将程序细节划分为模块化的部分。在这个例子中,Python 的异常机制允许我们分离迭代改进的逻辑,它在` try ` 子句组中没有发生改变,以及错误处理的逻辑,它出现在` except ` 子句中。我们也会发现,异常在使用 Python 实现解释器时是个非常实用的特性。
0 commit comments