Scala 如何忽略异常?

Scala 如何忽略异常?,scala,Scala,有没有更优雅的方式来写以下内容 try { ... // Some throwing code return first } catch { case e:ExceptionType => {} // No code to execute. Ignore error. } return second 在Scala中,所有异常都不会被检查,所以如果您不想,您可以跳过处理它们(这样异常将升级到更高级别)。以您希望的方式默默地忽略异常通常是一种不好的做法。但是,您的代

有没有更优雅的方式来写以下内容

try {
    ... // Some throwing code
    return first
} 
catch {
    case e:ExceptionType => {} // No code to execute. Ignore error.
}
return second

在Scala中,所有异常都不会被检查,所以如果您不想,您可以跳过处理它们(这样异常将升级到更高级别)。以您希望的方式默默地忽略异常通常是一种不好的做法。但是,您的代码可以缩短为:

try {
  ... // Some throwing code
} catch {
  case e:ExceptionType => 
}

@Daniel已经提供了用于执行此操作的规范方法。查看
scala.util.control.Exception
中的其他方法——它们非常有用且通用

如果需要从try块中获取返回值,请使用
失败
,而不是
忽略
(但请注意,结果是
任何
,即,不是类型安全的)

您还可以编写自己的异常捕获程序,对于繁重的工作来说,这会有点慢,但使用起来很好:

class DefaultOn[E <: Exception] {
  def apply[A](default: => A)(f: => A)(implicit m: Manifest[E]) = {
    try { f } catch { case x if (m.erasure.isInstance(x)) => default }
  }
}
object DefaultOn { def apply[E <: Exception] = new DefaultOn[E] }

scala> DefaultOn[NumberFormatException](0) { "Hi".toInt }
res0: Int = 0
class-DefaultOn[ea](f:=>A)(隐式m:Manifest[E])={
尝试{f}catch{case x if(m.erasure.isInstance(x))=>default}
}
}
对象DefaultOn{def apply[E DefaultOn[NumberFormatException](0){“Hi”.toInt}
res0:Int=0
或者,如果您喜欢以下选项:

class TryOption[E <: Exception] {
  def apply[A](f: => A)(implicit m: Manifest[E]) = {
    try { Some(f) } catch { case x if (m.erasure.isInstance(x)) => None }
  }
}
object TryOption { def apply[E <: Exception] = new TryOption[E] }

scala> TryOption[NumberFormatException] { "Hi".toInt }
res1: Option[Int] = None
class-TryOption[ea](隐式m:Manifest[E])={
尝试{Some(f)}捕获{case x if(m.erasure.isInstance(x))=>None}
}
}
对象TryOption{def apply[E TryOption[NumberFormatException]{“Hi”.toInt}
res1:选项[Int]=无
或者,您也可以从中得到启发,再加上库例程,创建自己的方法来忽略多个不同的异常,并在返回值上保留类型。

如何:

Try { 
     // some throwing code 
}

这将忽略所有非致命异常,这是您大部分时间想要做的。

顺便说一句,它可以通过
处理(classOf[NumberFormatException])编写得更短
您所说的非致命异常是什么意思?请查看Try的源代码,它调用了NonFatal,它认为VirtualMachineError、ThreadDeath、InterruptedException、LinkageError和ControlThrowable是致命的。这是不准确的。从Scala 2.11开始,这将在编译时发出警告:“没有catch或finally的try相当于将其主体放入块中;不处理任何异常。”事实上,这与根本不使用try完全相同。您必须添加catch来捕获非致命异常,即catch{case NonFatal(e)=>}你把try和try搞混了,这是这种忽略异常的方法的主要问题。如果抛出的代码必须返回一个值,该怎么办?
Try { 
     // some throwing code 
}