Erlang错误处理,“try”中的X不安全

92dk7w1h  于 2023-08-01  发布在  Erlang
关注(0)|答案(2)|浏览(168)

有没有人能告诉我为什么这段代码会说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

字符串

f45qwnt8

f45qwnt81#

最简单的解决方法是将赋值放在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.

字符串
至于为什么会发生这种情况,Erlang参考手册中关于表达式的章节说:
对于try表达式,变量作用域是有限的,因此表达式中绑定的变量在表达式外部总是“不安全”的。
它曾经说“这是有待改进的”,但在this commit中被删除了。

xxe27gdn

xxe27gdn2#

这是不安全的,我相信,由于事实上,你没有涵盖所有的例外。当你有

catch K -> (X = 0)

字符串
我相信它只会捕获抛出的异常,仍然有错误和退出。IIRC所以你可能需要

catch _:K -> (X=0)


或明确地将它们捕获为

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


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

相关问题