Scala 2.9 try ... catch 기능에 대해 읽었으며 실험했습니다. 가능성에 대해 생각하고 있습니다. 몇 줄의 코드를 저장하는 것 이외에 실제로 무엇을 사용할 수 있습니까?Scala 2.9의 try ... catch 일반화의 사용 사례는 무엇입니까?
답변
을 사용하는 경우 응용 프로그램을 통해 처리하는 일반적인 오류를 가질 수있을 것입니다. 관리자에게 전자 메일을 보내 응용 프로그램의 모든 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
의 정확한 의미와 의미 (및 이름)을 추가로 플레이 할 수 같아요.
좋은 답변 - 나는 또한 내가 잃어버린 부분이라고 생각합니다. – Seth
좋은 답변은 axel22입니다.하지만 그 소개의 진정한 이유는 뭔가 다른 것 같습니다. try
/catch
/finally
처리는 전용 케이스을 도입했습니다. 부분 함수 리터럴을 사용했지만 실제로 그것을 부분 함수로 대체 할 수는 없습니다. 자, catch
은 부분 기능을 수신하고 언어에서 한 가지 특별한 경우는 사라졌습니다.
- 1. Scala DRYing try/catch
- 2. Scala + Akka로 이상한 try/catch 동작
- 3. WindowProc MFC에서 try/catch 사용
- 4. 업데이트를 위해 try/catch 사용
- 5. () try {} catch {}
- 6. Try-catch catch not exceptions
- 7. throw new/try/catch
- 8. GCD @try @catch @finally
- 9. Java : Try-Catch-Continue?
- 10. Try/Catch Use Convention
- 11. 구문 및 try-catch() 사용 - 마지막 반복?
- 12. C++에서 try/catch 블록 사용
- 13. Try/Catch/Finally, Catch in Finally에서 예외를 사용 하시겠습니까?
- 14. SQL 트랜잭션 + Try-catch 또는 VB.NET Transaction + Try-catch?
- 15. C++ 프로그래밍 try catch
- 16. Try-Catch Statement Trouble
- 17. Matlab try/catch
- 18. MySql try catch
- 19. 서비스를위한 글로벌 try-catch
- 20. Javascript try/catch scope
- 21. try-catch arround 콜백
- 22. .NET 스레드 풀에서 catch catch try 시도
- 23. try catch catch final 예외가 catch되지 않습니다.
- 24. try/catch 블록에서의 에러 처리
- 25. Arduino에서 try/catch 블록을 사용합니다.
- 26. try - catch 블록에서 Java 루핑하기
- 27. zeromq 사용 사례는 무엇입니까?
- 28. System.Threading의 사용 사례는 무엇입니까?
- 29. try catch 지점이 마침내 차단됩니까?
- 30. try {} catch {}가 작동하지 않습니다
나는 그것을 사용할 것이라고 확신하지 못한다. 그러나 * any * (conforming) PartialFunction을 사용할 수있다. (예 :'ignoreTheseSillyClosableExceptions'). 게다가 스칼라가 그런 식으로 표현할 수있는 "멋지네요." –
영감을 얻으려면 Paul Philips가 이것을 구현할 때 동기 부여 예제를 제공했습니다. http://www.scala-lang.org/node/8070 –
질문은 예제 또는 적어도 링크와 함께 더 좋을 것입니다. – ziggystar