为什么我的变量在 erlang try 中不安全?

Pio*_*trP 2 erlang exception

我是 Erlang 的新手。我对下面的代码有问题:

try
    {ok, [Card]} = io:fread("Input card number: ","~d")
    catch
      error:K -> (Card=0);
      exit:K -> (Card=0);
      throw:K -> (Card=0)
    end,
Run Code Online (Sandbox Code Playgroud)

我不知道为什么“尝试”中的“变量”卡不安全。我该怎么办?

leg*_*cia 5

像你这样的代码可以在case表达式中工作,但对于 a try,这是 Erlang 中变量绑定规则的一个例外。从参考手册

对于 Erlang 5.4/OTP R10B 中引入的 try 表达式,变量范围是有限的,因此表达式中绑定的变量在表达式之外始终是“不安全的”。这是有待改进的。

你可以这样写你的代码:

Card =
  try
    {ok, [C]} = io:fread("Input card number: ","~d"),
    C
  catch
    error:K -> 0;
    exit:K -> 0;
    throw:K -> 0
  end,
Run Code Online (Sandbox Code Playgroud)