Erlang错误处理,'尝试'中的X不安全

时间:2010-08-16 14:04:28

标签: erlang try-catch

任何人都可以告诉我为什么这些代码会在“尝试”中吐出X是不安全的,我知道为什么,但更多的是如何解决它。

try X = lists:append(lists:zipwith3(fun(X, Y, Z) -> [X, Y, Z] end, Data1, Data2, Data3)) of
            MP -> X
            catch K -> (X = 0)
            end.
            %MP = [lists:zipwith3(X, Y, Z) || X, Y, Z <-  [Data1, Data2, Data3]],


P = X

2 个答案:

答案 0 :(得分:10)

解决它的最简单方法是将赋值放在try-catch之外:

X =
    try lists:append(lists:zipwith3(fun(X, Y, Z) -> [X, Y, Z] end, Data1, Data2, Data3)) of
        MP -> MP
    catch K -> 0
    end.

答案 1 :(得分:0)

我认为这是不安全的,因为你没有涵盖所有例外情况。 当你有

catch K -> (X = 0)

我相信它只能捕获抛出异常,仍有错误,并退出。 IIRC 所以你可能需要

catch _:K -> (X=0)

或明确地将它们视为

catch 
  error:K -> (X=0);
  exit:K -> (X=0);
  throw:K -> (X=0)

(我不是100%,我的原子名称是正确的,但这个想法仍然是一样的)