2010-08-16 3 views
2

Quelqu'un peut-il m'éclairer pour savoir pourquoi ce bit de code crache que le X est dangereux dans 'try', eh bien je sais pourquoi, mais plus encore comment y remédier.Erlang Gestion des erreurs, X dangereux dans 'try'

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 

Répondre

10

La façon la plus simple de le corriger est de mettre l'affectation à l'extérieur du 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

Il est dangereux, je crois en raison du fait que vous ne couvre pas toutes les exceptions. Lorsque vous avez

catch K -> (X = 0) 

Je crois que ça ne va attraper les exceptions lancées, il y a encore des erreurs, et les sorties. IIRC de sorte que vous aurez probablement besoin

catch _:K -> (X=0) 

ou les attraper explicitement

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

(je ne suis pas 100% que j'ai les noms d'atome correct, mais l'idée est toujours la même)