2011-11-04 9 views
18

Esto es básicamente para envolver los métodos de fábrica java que generan excepciones si el elemento no se puede crear en función de las entradas. Estoy buscando algo en la biblioteca de base como:En Scala, ¿existe una función de biblioteca preexistente para convertir excepciones en Opciones?

def exceptionToOption[A](f: => A):Option[A] ={ 
    try{ 
     Some(f)} 
    catch{ 
     case e:Exception => None} 
    } 

Uso:

val id:Option[UUID] = exceptionToOption(UUID.fromString("this will produce None")) 

sé que puedo escribir mi propio pero quiero comprobar que no estoy re-inventar la rueda.

+0

me falta un caso de uso, pero ¿no podría usar [Cualquiera] (http://www.scala-lang.org/api/current/scala/Either.html)? – aishwarya

+3

'O' me parece una mejor idea también. Puede haber información útil en la excepción –

+1

La validación de Scalaz es una mejora para cualquiera de las dos situaciones. –

Respuesta

15

Uso scala.util.control.Exception:

import scala.util.control.Exception._ 

allCatch opt f 

Y usted puede hacer que sea más sofisticado. Por ejemplo, para atrapar únicas excepciones aritméticas y recuperar la excepción:

scala> catching(classOf[ArithmeticException]) either (2/0) 
res5: Either[Throwable,Int] = Left(java.lang.ArithmeticException:/by zero) 
1

Scalaz ofrece Validation[+E, +A] que es similar a Either.

val result: Validation[Throwable, Something] = ... 

result match { 
    case Success(x) => ... 
    case Failure(x) => ... 
} 
8

A partir de Scala 2.10, puede ejecutar su código (por ejemplo, método de fábrica) en un scala.util.Try y después convertirlo con toOption:

import scala.util.Try 
Try("foo".toInt).toOption // None 
Try("7".toInt).toOption // Some(7) 

o traducido a su original ejemplo:

val id: Option[UUID] = Try(UUID.fromString("this will produce None")).toOption 
Cuestiones relacionadas