2011-11-04 8 views
18

これは基本的に、入力に基づいて項目を作成できない場合に例外をスローするJavaファクトリメソッドをラップすることです。私は私自身を書くことができます知っているが、私は、私は、車輪を再発明していないです確認したいScalaでは、例外をオプションに変換するための既存のライブラリ関数がありますか?

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

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

使用法:私のような基本ライブラリで何かを探しています。

+0

いくつかのユースケースが欠落している必要がありますが、[どちらか](http://www.scala-lang.org/api/current/scala/Either.html)を使用できませんでしたか? – aishwarya

+3

「どちらか」は私にとっても良いアイデアに見えます。例外に有用な情報がある可能性があります –

+1

Scalazの検証は、このシナリオのいずれかの改善です。 –

答えて

15

使用scala.util.control.Exception

import scala.util.control.Exception._ 

allCatch opt f 

そして、あなたはそれがより洗練されたことができます。たとえば、唯一の算術例外をキャッチし、例外を取得します

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

ScalazはEitherに似てValidation[+E, +A]を提供します。 Scalaの2.10のよう

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

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

、あなたはscala.util.Try(例えばファクトリメソッド)あなたのコードを実行し、その後toOptionでそれを変換することができます:

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

またはあなたの元の例に翻訳:

val id: Option[UUID] = Try(UUID.fromString("this will produce None")).toOption 
関連する問題