2011-11-04 3 views
18

Si tratta fondamentalmente di avvolgere i metodi di factory java che generano eccezioni se l'elemento non può essere creato in base agli input. Sto cercando qualcosa nella biblioteca di base come:In Scala, esiste una funzione di libreria preesistente per convertire le eccezioni in Opzioni?

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

Usage:

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

So che posso scrivere il mio, ma voglio verificare non sto re-inventare la ruota.

+0

devo mancare qualche caso d'uso, ma non potresti usare [Either] (http://www.scala-lang.org/api/current/scala/Either.html)? – aishwarya

+3

"O anche" sembra un'idea migliore per me. Potrebbero esserci informazioni utili nell'eccezione –

+1

La convalida di Scalaz è un miglioramento per entrambi in questo scenario. –

risposta

15

Uso scala.util.control.Exception:

import scala.util.control.Exception._ 

allCatch opt f 

E si può rendere più sofisticato. Ad esempio, per catturare uniche eccezioni aritmetiche e recuperare l'eccezione:

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

Scalaz fornisce Validation[+E, +A] che è simile a Either.

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

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

Come di Scala 2.10, è possibile eseguire il codice (ad esempio il metodo di fabbrica) in un scala.util.Try e poi convertirlo con toOption:

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

o tradotta in tuo esempio originale:

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