在Sorbet中使用raise / throw的方法的语法

时间:2019-08-12 01:10:42

标签: sorbet

是否有一种方法可以指定某个方法可能raise的异常,因此知道可能需要一个rescue

在Java(Doc)中,它看起来是这样的:

void example(int: x) throws Exception {
  if x > 42 throw new Exception;
}

也许是这样!

→ View on sorbet.run

# typed: true
extend T::Sig

sig {params(x: Integer).void.raises(StandardError)}
def example(x)
  raise RuntimeError if x > 42
end

不要感到困惑:通常的异常是在Ruby中使用raise ... rescue处理的。

begin
  raise StandardError
rescue StandardError
end

但是您也可以throw个对象,并catch用Ruby来实现。

catch(:something) do
  throw :something
end

我用的不是很多。实际上试图完全避免它。但是Sorbet可能对此也有语法!例如:

→ View on sorbet.run

# typed: true
extend T::Sig

sig {params(x: Integer).void.throws(:something)}
def example(x)
  throw :something if x > 42
end

catch (:something) {example(42)}

1 个答案:

答案 0 :(得分:0)

Sorbet不支持检查的异常。 原因是当今使用Java的人们之间普遍达成共识,即他们甚至无法使用Java的其他功能。例如,在下面的代码段中

foo do
  # code that calls into something that can throw
end

在Java中,您正式被迫在#内捕获异常,并将其作为未经检查的异常重新抛出,因为通常该块可能会溢出到堆中。 总体而言,如果您研究遵循Java的语言:Scala和Kotlin,它们都不支持检查的异常。