2011-10-17 1 views
19

Scala 2.9 try ... catch 기능에 대해 읽었으며 실험했습니다. 가능성에 대해 생각하고 있습니다. 몇 줄의 코드를 저장하는 것 이외에 실제로 무엇을 사용할 수 있습니까?Scala 2.9의 try ... catch 일반화의 사용 사례는 무엇입니까?

Scala 2.9 Final Release Notes

+0

나는 그것을 사용할 것이라고 확신하지 못한다. 그러나 * any * (conforming) PartialFunction을 사용할 수있다. (예 :'ignoreTheseSillyClosableExceptions'). 게다가 스칼라가 그런 식으로 표현할 수있는 "멋지네요." –

+0

영감을 얻으려면 Paul Philips가 이것을 구현할 때 동기 부여 예제를 제공했습니다. http://www.scala-lang.org/node/8070 –

+3

질문은 예제 또는 적어도 링크와 함께 더 좋을 것입니다. – ziggystar

답변

24

을 사용하는 경우 응용 프로그램을 통해 처리하는 일반적인 오류를 가질 수있을 것입니다. 관리자에게 전자 메일을 보내 응용 프로그램의 모든 FileNotFoundException을 처리하려고한다고 가정 해 봅시다. 이전에는이처럼해야 할 것 :

// Globally 
val fileNotFound: PartialFunction[Throwable, Unit] = { 
    case e: FileNotFoundException => 
    // Create report and send the e-mail 
} 

// On each try-catch-block 
try { 
    // Open file 
} 
catch { 
    case fnf: FileNotFoundException => fileNotFound(fnf) 
} 

지금 당신은 할 수 :

try { 
    // Open file 
} catch fileNotFound 

이 또한 당신의 orElse 방법을 사용하여 여러 개의 같은 예외 핸들러를 연결 할 수있는 좋은 장점이있다 부분 함수 :

val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat 

그런 다음 파일 예외 처리가 필요한 모든 곳에서 사용하십시오. 이러한 오류 핸들러는 예를 들어 응용 프로그램의 구성 파일에 따라 동적으로 결합 될 수 있습니다. 이것은 어디에서나 일치하는 패턴과 올바른 핸들러를 호출하는 것보다 훨씬 덜 복잡합니다.

부분 함수 위에 포주가 될 수있는 유용한 점은 andAlso 연산자입니다.이 연산자는 두 부분 함수에서 순서 연산자로 사용됩니다. 이는 일반적인 오류 처리를 수행 한 후에 특정 try-catch 블록에 특정한 오류 처리를 수행하려는 경우에 유용합니다.

implicit def pf2ops(pf: PartialFunction[Throwable, Unit]) = new { 
    def andAlso(localpf: PartialFunction[Throwable, Unit]) = new PartialFunction[Throwable, Unit] { 
    def apply(t: Throwable) = { 
     if (pf.isDefinedAt(t)) pf(t) 
     localpf(t) 
    } 
    def isDefinedAt(t: Throwable) = pf.isDefinedAt(t) || localpf.isDefinedAt(t) 
    } 
} 

그리고 당신은이 작업을 수행 할 수 있습니다

scala> try { 
    | throw new java.io.FileNotFoundException 
    | } catch fnf andAlso { 
    | case e: Exception => println("I don't know, but something is specific to this particular block.") 
    | } 
I don't know, but something is specific to this particular block. 

난 당신이 andAlso의 정확한 의미와 의미 (및 이름)을 추가로 플레이 할 수 같아요.

+0

좋은 답변 - 나는 또한 내가 잃어버린 부분이라고 생각합니다. – Seth

7

좋은 답변은 axel22입니다.하지만 그 소개의 진정한 이유는 뭔가 다른 것 같습니다. try/catch/finally 처리는 전용 케이스을 도입했습니다. 부분 함수 리터럴을 사용했지만 실제로 그것을 부분 함수로 대체 할 수는 없습니다. 자, catch은 부분 기능을 수신하고 언어에서 한 가지 특별한 경우는 사라졌습니다.

+0

나는이 대답도 좋아한다. – Seth

+0

이것은 실제로 나의 초기 추론을 확인한다 - 이것은 주로 "깔끔함"특징이다. – Seth

+0

동의 - 결과적으로 유용성을 갖는 일반화 된 구조 - 최선의 일관성 원칙입니다. – axel22