Erlang如何与try搭配使用

时间:2018-07-12 09:13:32

标签: erlang

我在Erlang非常陌生。 我想使功能检查禁令词。

但是我遇到语法错误.. 如何在if else语句中使用try catch?

check_banword(Word, BlackWord) ->
    try 
      Res = string:rstr(Word, BlackWord),
      if Res > 0 -> 
          true;
      true ->    
          false
    catch
      false
    end.

2 个答案:

答案 0 :(得分:3)

代码中的两个问题:

  1. end之后缺少if
  2. catch语法不正确,catch将异常与值匹配,您不能在那里只有一个值。

经过更改使其能够编译的代码如下

    check_banword(Word, BlackWord) ->
      try 
        Res = string:rstr(Word, BlackWord),
        if
          Res > 0 -> 
            true;
          true ->    
            false
        end
      catch
        _ -> false
      end.

答案 1 :(得分:3)

在这种情况下,您实际上不需要if,可以将try与模式和防护一起使用。以这种方式使用时,try看起来像一个case表达式,末尾有catch节。 (请注意,tryof之间的部分仅受catch“保护”-在这种情况下,它没有任何区别,因为其余代码无法引发错误。)

还要注意,您需要指定要捕获的异常类型,errorexitthrow之一。如果您未指定异常类型,则默认为throw-这不是您想要的,因为string:rstr从不抛出任何东西,只有在参数不正确时它才会引发错误类型。

那应该是:

check_banword(Word, BlackWord) ->
  try string:rstr(Word, BlackWord) of
      Res when Res > 0 -> 
        true;
      _ ->    
        false
  catch
    error:_ -> false
  end.

还有一个更广泛的问题:您是否应该在此处实际使用try?如果此函数发生错误,则表示参数不是字符串,这是调用者的责任。由于此功能无法解决该问题,因此我想说它不应捕获错误,而应将其传播给调用者。 (这就是Erlang的“让它崩溃”的哲学。)