在Scala中,空的catch块似乎是无效的。
try {
func()
} catch {
} // error: illegal start of simple expression
我如何捕获所有异常但不对其进行处理?
在Scala中,空的catch块似乎是无效的。
try {
func()
} catch {
} // error: illegal start of simple expression
我如何捕获所有异常但不对其进行处理?
有些异常确实不应该被捕获。但你仍然可以请求它:
try { f(x) }
catch { case _: Throwable => }
但这可能不太安全。
scala.util.control.NonFatal
匹配所有安全的异常,因此您可以:
import scala.util.control.NonFatal
try { f(x) }
catch { case NonFatal(t) => }
对于稍微不那么冒险但仍非常有用的捕获操作。
或者scala.util.Try
可以为您完成:
Try { f(x) }
case
,改为 catch { case NonFatal(t) => }
吗? - Dirk Groeneveldcatch { case _: Throwable => }
? - nurgasemeteyIn
import scala.util.Try
val res = Try (func()) toOption
如果Try成功,您将得到Some(value)
,如果失败,则为None
。
try {
func()
} catch {
case _: Throwable => // Catching all exceptions and not doing anything with them
}
case _ : Throwable
来清除此警告。
但是,当我改用case _ : Throwable
时,它无法编译:错误:需要' =>',但找到了'}' - tmporariescase _: Throwable =>
表达你不是无意中这样做的。 - som-snyttscala> def quietly[A]: PartialFunction[Throwable, A] = { case _ => null.asInstanceOf[A] }
quietly: [A]=> PartialFunction[Throwable,A]
scala> val x: String = try { ??? } catch quietly
x: String = null
这有一个小优点,即自我记录。
scala> val y = try { throw new NullPointerException ; () } catch quietly
y: Unit = ()
编辑:语法更改包括try-catch中减少大括号,使用函数进行捕获和将函数字面量作为偏函数:
scala> def f(t: Throwable) = ()
def f(t: Throwable): Unit
scala> try throw null catch f
^
warning: This catches all Throwables. If this is really intended, use `case _ : Throwable` to clear this warning.
scala> def f: PartialFunction[Throwable, Unit] = _ => ()
def f: PartialFunction[Throwable,Unit]
scala> try ??? catch f
标签。
case x =>
我喜欢这里的一个建议,即使用Try()
和toOption
,但是如果您不想继续使用Option,您也可以这样做:
Try(func()) match {
case Success(answer) => continue(answer)
case Failure(e) => //do nothing
}
这个怎么样:
import scala.util.control.Exception.catching
catching(classOf[Any]) opt {func()}
它会生成一个像之前某些答案中的选项。