잠재적으로 실패 할 수있는 일부 작업 (예 : 웹 페이지 가져 오기)을 수행하는 방법이 있다고 상상해보십시오. 당신이 그것을 사용하려는 경우
def getUrl(url: String): NodeSeq = {
val page = // ...
// ...
if (failure) throw new PageNotFoundException()
page
}
, 당신은 상황에 따라
val node = try {
getUrl(someUrl)
} catch {
case PageNotFoundException => NodeSeq.Empty
}
또는 유사 할 필요가있다. 그래도 그래도 괜찮은 것 같습니다. 그러나 이제 URL 모음에 대해이 작업을 수행하려고한다고 가정합니다.
val urls = Seq(url1, ...)
val nodeseqs: Seq[NodeSeq] = try {
urls.map(getUrl)
} catch {
case PageNotFoundException => Seq.Empty
}
좋아, 이렇게하면 페이지 중 하나를로드 할 수 없을 때마다 빈 시퀀스가 반환됩니다. 우리가 최대한 많은 것을 받고 싶다면 어떻게해야할까요?
val urls = Seq(url1, ...)
val nodeseqs: Seq[NodeSeq] = urls.map { url =>
try {
getUrl(url)
} catch {
case PageNotFoundException => NodeSeq.Empty
}
}
이제 로직이 오류 처리 코드와 혼합됩니다.
는 다음이 비교 :
Option
또는
Box
(또는
Either
또는 scalaz '
Validation
)를 사용하여
def getUrl(url: String): Box[NodeSeq] = {
val page = // ...
// ...
if (failure) Failure("Not found")
else Full(page)
}
val urls = Seq(url1, ...)
val nodeseqs: Seq[Box[NodeSeq]] = urls.map(getUrl(url)).filter(_.isDefined)
// or even
val trueNodeseqs: Seq[NodeSeq] = urls.map(getUrl(url)).flatten
적 예외를 수 던지는 것보다 문제를 처리 할 때 결정을 통해 당신에게 방법으로 더 많은 전력을 제공합니다.
예외가 있으면 스택을 가로 질러서 그곳에서 어떤 지점으로 잡을 수 있습니다. 유형 내에서 오류를 인코딩하는 경우 가장 적절하다고 판단되는 상황에서 원하는만큼 오류를 처리하고 처리 할 수 있습니다.
좋은 질문입니다. 나는 그것에 대해 생각 해본 적이 없다 ... – drozzy
@drozzy 메일 링리스트에서 답변을 읽었는지 확인하십시오. http://goo.gl/5Lv7V –