1

有没有办法指定方法可能会出现哪些异常raise,所以知道rescue可能需要哪些异常?

 

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

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

 

也许是这样的!?

→ 在 sorbet.run 上查看

# typed: true
extend T::Sig

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

 

 

不要混淆:通常的异常是raise ... rescue在 Ruby 中处理的。

begin
  raise StandardError
rescue StandardError
end

但是您也可以在 Ruby 中使用throw对象和它们。catch

catch(:something) do
  throw :something
end

我不经常使用这个。实际上试图完全避免它。但是 Sorbet 也可能有这样的语法!?例如:

→ 在 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)}
4

1 回答 1

0

Sorbet 不支持检查异常。这样做的原因是,如今从事 Java 工作的人们普遍认为,他们甚至不能很好地使用 Java 的其他特性。例如,在下面的片段中

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

在 Java 中,您被迫在内部捕获异常#并将它们重新抛出为未经检查的异常,因为通常该块可能会逃逸到堆中。总的来说,如果你研究一下 Java 之后的语言:Scala、Kotlin,它们都不支持检查异常。

于 2019-08-12T16:52:57.020 回答