Erlang Обработка ошибок, X небезопасно в «попробовать» - PullRequest
2 голосов
/ 16 августа 2010

Может ли кто-нибудь объяснить мне, почему этот фрагмент кода показывает, что 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 ]

10 голосов
/ 16 августа 2010

Самый простой способ исправить это - поместить задание вне 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.
0 голосов
/ 20 августа 2010

Полагаю, это небезопасно из-за того, что вы не охватили все исключения. Когда у вас есть

catch K -> (X = 0)

Я полагаю, что он будет перехватывать только сгенерированные исключения, есть ошибки и выходы. IIRC так что вам, вероятно, понадобится

catch _:K -> (X=0)

или явно поймать их как

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

(я не на 100% уверен, что у меня правильные имена атомов, но идея все та же)

...