我已閱讀並嘗試過Scala 2.9 try ... catch功能,並讓我思考可能性。除了保存幾行代碼之外,我真的會用它來做什麼?Scala 2.9的try ... catch泛化的用例是什麼?
19
A
回答
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
很好的答案 - 我認爲andAlso部分是我失蹤的一點。 – Seth
7
相關問題
- 1. Try Catch中的例外是什麼
- 2. 什麼是PHP中的異常,什麼是try和catch?
- 3. 爲什麼需要try/catch塊的BufferedWriter
- 4. 什麼時候使用try multi catch?
- 5. 良好的通用try/catch例程
- 6. 在PDO中使用try和catch的最好方法是什麼
- 7. Scala Continuations - 爲什麼我的移位調用不能在try-catch塊中?
- 8. 什麼是Scala 2.9中的標準十進制類型?
- 9. try catch的用法
- 10. 這個樣本是否適合使用try catch?什麼是sugesstions?
- 11. Scala - 使用參數實例化泛型?
- 12. 處理例外與Try Catch
- 13. 我怎麼能初始化try catch塊中的val對象?
- 14. 是我的try catch塊嗎?
- 15. 什麼是SQL服務器的try catch塊的mysql等價物
- 16. Try try-catch-finally
- 17. 爲什麼try catch中的「catch」聲明類型爲$ e
- 18. 的try ... catch VS IF ... ELSE例外 - 的Java
- 19. Java - 在try/catch中執行try/catch是不好的做法嗎?
- 20. 您認爲在catch中嵌套try/catch語句有什麼用?
- 21. 的try/catch塊
- 22. Try-Catch格式化C#
- 23. 正在初始化Try/Catch
- 24. scala try/catch沒有捕捉到一些例外
- 25. 爲什麼try塊需要一個catch
- 26. try/catch/finally中發生了什麼?
- 27. 什麼時候必須圍繞try/catch?
- 28. 這個try catch有什麼問題?
- 29. try,catch和finally的執行順序是什麼?
- 30. 爲什麼這個SocketException未被泛型catch例程捕獲?
我不確定我會用它....但是您可以使用任何*(符合)PartialFunction ...在其他地方有統一的錯誤處理? (說'ignoreTheseSillyClosableExceptions'。)另外,「這很酷」,斯卡拉可以這樣表達它;-) – 2011-10-17 02:42:18
靈感:Paul Phillips提供了一個激勵的例子,他實現了這個:http://www.scala-lang.org/node/8070 –
這個問題最好用一個例子或至少一個鏈接。 – ziggystar