郎咸武 2009年08月18日 星期二 23:30 | 1097次浏览 | 3条评论
已修正错误与未修正错误
g(X) ->
case (catch h(X)) of
{'EXIT', _} ->
10;
Val -> Val
end.
h(cat) -> exit(dog);
h(N) -> 10*N.
求值 h(cat)将产生一个异常, 而求值 h(20)将返回值 200。求值 g(cat)或 g(dog)
将返回值 10 而求值 g(10)将返回值 100。
当我们求值 g(cat)时,将发生如下一系列事情:
1.求值 h(cat)被求值。
2.h 产生一个异常。
3.该异常被 g 捕获。
4.g 返回一个值。
当求取 g(dog)之值时,将引发下列事情:
1.h(dog)被求值。
2.在 h 的函数体中,变量 N 被绑定为值 dog。
3.求取 N=dog 时 N*10 的值。
(译注:进行乘法运算的函数)中产生了一个异常。
4.在函数‘*’
5.该异常被传播给函数 h。
6.该异常被函数 g 捕获。
7.g 返回一个值。
如果我们仔细观察上面的过程我们就可以发现: 在求值 h(dog)中产生了一个
异常,而该异常在 g 中被捕获并被纠正了。
在此我们就可以说一个错误确实发生了,但是它被修正了。
如果我们是直接求值 h(dog), 那么将会产生异常,但是并没有被捕获和修正。
Zeuux © 2024
京ICP备05028076号
回复 刘磊(V.L.) 2009年08月19日 星期三 08:18
回复 郎咸武 2009年08月19日 星期三 08:59
回复 徐继哲 2010年02月26日 星期五 18:23