我正在使用 Erlang R16B03。
这段代码:
list_dir(Directory, Retries) when is_integer(Retries), Retries > 0 ->
Port = get_efile_port(),
try erlang:port_info(Port) of
Result ->
error_logger:info_msg("list_dir - erlang:port_info(~p) -> ~p ", [Port,Result])
catch
_:Reason ->
error_logger:info_msg("list_dir - erlang:port_info(~p) -> {error, ~p }",[Port,Reason])
end,
case prim_file:list_dir(Port, Directory) of
{error, einval} ->
error_logger:info_msg(" list_dir - port : ~p , directory : ~p", [Port, Directory]),
clear_efile_port(),
list_dir(Directory, Retries-1);
Result ->
Result
end.
生成以下编译器异常:
/basho/riak/deps/bitcask/src/bitcask_fileops.erl:855: variable 'Result' unsafe in 'try' (line 843)
ERROR: compile failed while processing /basho/riak/deps/bitcask: rebar_abort
make: *** [compile] Error 1
但是如果我将变量名 Result
的第一次使用重命名为 Res
,它可以正常编译,例如:
list_dir(Directory, Retries) when is_integer(Retries), Retries > 0 ->
Port = get_efile_port(),
try erlang:port_info(Port) of
Res ->
error_logger:info_msg("list_dir - erlang:port_info(~p) -> ~p ", [Port,Res])
catch
_:Reason ->
error_logger:info_msg("list_dir - erlang:port_info(~p) -> {error, ~p }",[Port,Reason])
end,
case prim_file:list_dir(Port, Directory) of
{error, einval} ->
error_logger:info_msg(" list_dir - port : ~p , directory : ~p", [Port, Directory]),
clear_efile_port(),
list_dir(Directory, Retries-1);
Result ->
Result
end.
据我所知,变量位于两个不同的范围内(try/catch 和 case)。
这是编译器错误还是我未能正确理解 Erlang 语法?
最佳答案
这不是编译器错误。问题是在第一个示例中,您使用 Result
在两个地方:首先在 try
,然后再次输入 case
。这不是两个不同的范围,而是相同的范围。编译器会提示,因为如果 try
中没有引发异常, Result
将绑定(bind)到 erlang:port_info(Port)
的结果调用,但如果该调用引发异常,Result
不会被束缚。这意味着它在 case
范围内使用将是不明确的,因为在第二个 case
如果它已经绑定(bind),或者绑定(bind)到 prim_file:list_dir(Port, Directory)
的结果,则它会被匹配。如果尚未绑定(bind)。
关于syntax - 二郎 : variable 'Result' unsafe in 'try' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31563995/