2012-07-15 28 views
3

在考慮到潛在的運行時故障,如數據庫查詢,似乎是一個必須使用某種形式的Either[String, Option[T]]爲了準確地捕捉到以下成果:Scala:是唯一的選擇嗎?

  1. 一些(發現結果)
  2. 無(沒有發現結果)
  3. SQL異常

選項根本沒有足夠的選擇。

我想我需要潛入斯卡拉,但現在它是直的要麼,除非我在上面丟失了一些東西。

已經把自己裝進了我的DAO實現的一個角落,只使用Either進行寫入操作,但現在我發現有些寫入依賴於Option讀取(例如檢查新用戶註冊時是否存在電子郵件),這是一個主要的糟糕的賭博。

在我全力以赴之前任何人都沒有替代解決方案來處理成功/失敗/異常的運行時間三連勝嗎?

+1

由於記錄是一種可能性'或者[String,List [T]]'會更合適,不是嗎? – pedrofurla 2012-07-15 00:48:15

+0

取決於,我需要處理選項[T]和列表[T]或選項[列表[T]]。現在我執行[String,SuccessType]進行寫操作,除非我另有說明,否則對讀操作也會這樣做。 – virtualeyes 2012-07-15 01:07:13

+0

@virtualeyes否,你真的不需要處理所有這些。你說有一些記錄,沒有記錄或異常,是否正確?那麼一些記錄可以是非空的記錄列表,沒有記錄可以是記錄的空列表,並且異常像往常一樣是左邊的任一部分。 – 2012-07-15 06:04:07

回答

4

使用Option[T]的情況下records foundno records found並拋出的SQLException中的情況例外。

只是將異常包裝在您自己的異常類型中,如PersistenceException,以便您沒有泄漏抽象。

我們這樣做是因爲我們不能也不想從意外的數據庫異常中恢復。在這種情況下,異常會陷入頂層,我們的Web服務會返回500 Internal server error

在我們想恢復的情況下,我們使用scalaz中的Validation,這很像Lift的Box

+1

+1,正在考慮讓異常冒泡並讓Web服務器生成一個500 ...但Box,Validation或者任一[Fail,Option [T]]提供了對實際出錯的更多控制,更不用說事務性通過{...}塊查詢,你無法使用Option結果類型。 – virtualeyes 2012-07-15 18:45:52

8

嘗試從奇妙lift框架Box。它提供了你想要的。

有關詳細信息,請參見this wiki(以及頂部的鏈接)。幸運的電梯項目以及模組化,使用Box唯一的依賴是net.lift-web % lift-common

+0

+1謝謝,Box和Either [Fail,Option [T]]之間有什麼區別?推測盒子更容易與... – virtualeyes 2012-07-15 01:21:47

+2

以及你寫的東西少:D。 Box是Monad,因此可以方便地檢索三種狀態中的任何一種或與其他方框組合。要查看Box如何運行您可以從[cheatsheet]開始(http://nerd.kelseyinnis.com/blog/2012/05/16/box-cheat-sheet-for-lift/) – xiefei 2012-07-15 01:22:18

+0

偉大的鏈接,太糟糕了作者尚未撰寫他在Box上提及的文章,以便理解。我對{...}查詢事務塊使用Either Right預測,這是一個很棒的保護措施。對Box做同樣的事情會很好...... – virtualeyes 2012-07-15 13:40:27

0

這裏是我的修訂辦法

保留或者(在這裏我們要回滾對修真左結果對於事務塊有用)返回的查詢寫操作。但是,對於選項返回查詢讀取,而不是吞下與None(並記錄它)的異常,我創建了一個500錯誤屏幕,讓異常冒泡。

爲什麼不處理類似查詢異常的運行時失敗時默認使用任一結果類型?選項[T]讀取與vs [Why-Fail,Option [T]]一起工作會更方便一些,您必須摺疊/映射以獲取T.Leaving要麼寫操作簡化了事情(更重要的是所以鑑於這是應用程序目前的設置,不需要重構;-))

唯一需要的其他更改是AJAX請求。我們檢查狀態類型並相應地顯示500錯誤消息,而不是在AJAX狀態div容器中顯示整個500錯誤頁面響應。

if(data.status == 500) 
    $('#status > div').html("an error occurred, please try again") 

大概可以發送響應之前做一個isAjax檢查服務器端;在這種情況下,我只能發送狀態+消息而不是錯誤頁面本身。