2016-08-19 5 views
2

У меня есть следующий код (упрощенный):Обработки утратившего исключения из вызова API Java в Scala

def getSomething(name: String): MyError \/ Option[Int] = { 
    /* Returns Null if name doesn't exist, IOException if connection err. */ 
    val output: queryDB(name) 

    // ... 
} 

queryDB функция вызов Java.

Я хотел бы следующее произойдет: IOException сопоставляется с MyError и null к None. Как мне продолжить?

Я знаю, что я могу обернуть вывод в Option, так как null отображается на None. Однако как мне управлять исключением?

Спасибо.

+0

что-то не так с try/catch? вы также можете использовать 'scala.util.Try', т. е.' Try (Option (queryDB (name))), но старая школьная попытка/catch может быть проще здесь. –

ответ

1

Я хотел бы использовать комбинацию из Option и Try

import scala.util.{ Try, Success, Failure } 

def getSomething(name: String): MyError \/ Option[Int] = { 

    Try(queryDB(name)) match { 
    case Success(v) => Option(v).right // in case v is null, this returns a None 
    case Failure(e) => MyError().left 
    } 

} 

Это превращает все исключения в MyError. Если вам нужна конкретная обработка ошибок, вы можете сопоставлять по e и иметь более подробную информацию.

Также я использую .right и .left, которые исходят от пакета syntax. Если вы их не используете, вы можете заменить их на \/-(Option(v)) и -\/(MyError()) соответственно.

+0

'' Если вам нужна определенная обработка ошибок, вы можете сопоставлять их по e и иметь более подробную информацию. "' Это означает посмотреть на 'getMessage' Throwable'? –

+0

Нет, я имею в виду соответствие типа исключения –

1

Думаю, вам нужна комбинация Либо и Попробуйте. Используя метод «transform» метода Try, вы можете преобразовать результат в Либо [Throwable, Option [Int]]. Что-то вдоль линий,

// Change the 2nd arg of transform to MyError as per your requirement. 

def getSomething(name: String): Either[Throwable, Option[Int]] = { 
    Try(queryDB(name)).transform(s => Success(Right(Option(s))), f => Success(Left(f))).get 
}