2013-10-30 4 views
5

첫 번째 Scala 프로그램의 경우 XML 파일을 스키마간에 변환하는 작은 유틸리티를 작성하려고합니다. 반환하는 방법 Scala에서 없음

나는 나에게 파일 내용을 제공하는 방법을 쓰기 시작 :

def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = { 
    try 
    { 
     val source = scala.io.Source.fromFile(filename, encoding) 
     val contents = source.mkString 
     source.close() 
     return Some(contents) 
    } 
    catch 
    { 
     return None 
    } 

    } 

를하지만 컴파일되지 않습니다. "value 적용은 Nothing의 멤버가 아닙니다."및 "value isDefinedAt는 Nothing의 멤버가 아닙니다"라는 오류 메시지가 나타나 다시 return None 줄에 있습니다.

Option을 반환 할 때 찾을 수있는 모든 예는 여기에서 의미가 없습니다. 어떤 이유로 파일을 읽을 수 없으면 실패하지 않으려합니다.

이 경우 어떻게해야합니까? 스칼라에서 이런 종류의 일을하는 패턴이 있습니까?

답변

5

"catch"입니다. 스칼라

은은 컴파일하기 위해 다음과 같이해야하는데 :

def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = { 
    try { 
     val source = scala.io.Source.fromFile(filename, encoding) 
     val contents = source.mkString 
     source.close() 
     Some(contents) 
    } catch { 
     case x: IOException => None 
     case x => errorHandler(x) // if any other exception 
    } 
    } 

    def errorHandler(e: Any) = None // put some logic here.. 

그래서 사용 : 스칼라 catch에서

catch { case: x:ExceptionType ={ .. handling .. }} 

은 인수로 다른 기능을 허용하는 기능입니다. 그래서 당신이 가지고있는 것을 갖는 것은 기능을 적용하는 것에 대해 불평 할 것입니다. casecatch이 원하는 기능 (PartialFunction)을 제공합니다.

주 (한마디) : 모든 예외는 unchecked에서 ScalaIOException이다.

+0

하지만 Nicolas Rinaudo와 스타일에 대해 동의합니다. 발신자가 오류를 처리하는 방법을 결정하게합니다.때로는 호출자에게 오류를 보내기 전에 호출 측 (캐시를 지우는 것 또는 정리할 것)에서 처리해야하는 경우가 있습니다. – ses

0

이 시도 :

def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = { 
try 
{ 
    val source = scala.io.Source.fromFile(filename, encoding) 
    val contents = source.mkString 
    source.close() 
    return Some(contents) 
} 
catch 
    { 
    case e:Exception=>{ 
     return None 
    } 

    } 

}이 특정한 경우 (예외 처리)에서

8

, 내가 대신 Try을 사용하는 것이 좋습니다 것입니다.

def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = { 
    Try { 
     val source = scala.io.Source.fromFile(filename, encoding) 
     val contents = source.mkString 
     source.close() 
     return Some(contents) 
    }.toOption 
} 

그러나 예외를 잡는 것을 권장하지는 않습니다. None을 반환하여 오류의 원인을 삼키고 있습니다. FileNotFoundException입니까? 표준 IOException? 오류가있는 메시지가 있었습니까 (Unsupported encoding ...)?

내 경험상 발신자가 예외 처리를하도록하는 것이 좋습니다. Try 필요한 모든 방법을 가지고 있기 때문에, 그것은 오히려 깔끔한 방법으로를위한 이해 사용할 수 있습니다,

Try {loadFile("test.txt")}.toOption 

더 나은 아직 : 그 오류 자체를 걱정하지 않는 경우, 일을 처리하는만큼 간단합니다 :이 발생합니다

for(s <- Try {loadFile("test.txt")}; 
    i <- Try {s.toInt}) yield i 

중 하나 Success[Int] 또는 잘못되었는지 정확히 설명하는 예외를 포함하는 Failure.