2012-08-13 65 views
1

我只是尋找一些最佳實踐建議。由於業務邏輯錯誤而離開功能的最佳做法

我有一個服務,「價格表服務」,其中由用戶可以保存某種價格表。

有幾個實例或配置會導致數據不一致,並且在這些事件中我想結束函數執行。

一個例子是,如果未在對象上設置customerId,或者無法在數據庫中找到銷售人員的用戶標識。


我的問題是當遇到業務邏輯錯誤時離開函數的最佳方式是什麼?

我喜歡異常停止執行的方式,並允許您重新拋出異常。與此相關的問題是,我聽說異常不會用於流量控制。

目前我只是有一堆嵌套的if/elses,我沒有提交我的交易,除非沒有設置局部變量$service_error_message

如果$service_error_message爲空,那麼我知道我的驗證器都沒有失敗,可以保存。

有沒有人有建議如何更好地處理這些情況?

+1

如果可能發生的問題是程序正常執行的一部分,我不會使用異常或類似'die'的東西,您只需測試有效輸入並向用戶顯示錯誤消息。 – jeroen 2012-08-13 15:50:04

+0

@Leigh感謝提高可讀性Leigh。 – 2012-08-13 16:08:10

回答

2

如果遇到毫無疑問是致命的錯誤,則無法從中恢復,請清理並退出。如果你沒有清理超出當前過程的範圍(關閉文件/數據庫連接/任何,產生一些錯誤輸出等),那麼只需exit是最有意義的。如果錯誤有潛在的可恢復性,或者您想通過當前程序以外的某種方式以有序方式清理/記錄錯誤,那麼異常是最有意義的。這是一個個案的決定。

I've have heard exceptions aren't to be used for flow control - 這是事實,但並不真正適用於您所描述的情況。如果您遇到實際的錯誤,那麼異常是完全可以接受的。 應該不是所做的是使用異常來確定下一個要執行的代碼段,排序的重新散列值goto

很好的解釋什麼不該做,爲什麼不能找到here

1

通常情況下,我不會使用異常進行流量控制,因爲如果我期望有一些條件經常出現在我想要保留的腳本中,我會使用exit()調用。

在我看來,只有當你運行代碼中不應該發生的東西時(例如傳遞給對象的方法或函數的無效參數),纔會拋出異常 - 即真正例外的東西。我也只會在調用代碼周圍的try-catch塊的情況下才使用它們,以便能夠恰當地捕獲並處理異常。

因此,例如,我可能會遇到一種情況,我在try-catch塊內實例化數據庫連接,然後在無法建立連接的情況下讓數據庫抽象層拋出異常。如果數據庫連接對於服務的功能來說絕對是必不可少的,那麼該例外並將其記錄在適當的應用程序之外。

對我來說,從數據庫查詢(即檢查用戶登錄)獲取空結果集不是我不會通過拋出異常來處理的,而是提供適當的最終用戶消息並退出腳本如果需要,優雅。