2011-11-04 8 views
18

Điều này về cơ bản là bao bọc các phương thức của nhà máy java để loại trừ các ngoại lệ nếu mục đó không thể được tạo dựa trên các đầu vào. Tôi đang tìm kiếm cái gì trong thư viện cơ sở như:Trong Scala, có chức năng thư viện nào có sẵn để chuyển đổi ngoại lệ sang Tùy chọn không?

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

Cách sử dụng:

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

Tôi biết tôi có thể viết riêng của tôi, nhưng tôi muốn kiểm tra tôi không tái phát minh ra bánh xe.

+0

tôi phải thiếu một số trường hợp sử dụng, nhưng bạn không thể sử dụng [Hoặc] (http://www.scala-lang.org/api/current/scala/Either.html)? – aishwarya

+3

'Hoặc là 'cũng có ý tưởng tốt hơn cho tôi. Có thể có thông tin hữu ích trong Ngoại lệ –

+1

Xác thực của Scalaz là một cải tiến cho cả trong trường hợp này. –

Trả lời

15

Sử dụng scala.util.control.Exception:

import scala.util.control.Exception._ 

allCatch opt f 

Và bạn có thể làm cho nó phức tạp hơn. Ví dụ, để bắt chỉ ngoại lệ số học và lấy lại ngoại lệ:

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

Scalaz cung cấp Validation[+E, +A] đó cũng tương tự như Either.

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

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

Tính đến scala 2.10, bạn có thể chạy mã của bạn (ví dụ phương pháp nhà máy) trong một scala.util.Try và sau đó chuyển đổi nó với toOption:

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

Hoặc dịch với ví dụ ban đầu của bạn:

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