2009-06-18 36 views
1

我這是怎麼翻譯引發的錯誤:這是一個足夠好的系統錯誤對用戶友好錯誤翻譯器嗎?

 catch (NpgsqlException ex) 
     { 
      if (tx != null) tx.Rollback(); 

      if (ex.Message.Contains("foreign key constraint")) 
       throw new Exception("Cannot delete this, this record is already referenced on other record(s)"); 
      else 
       throw new Exception(ex.Message, ex.InnerException); 
     } 

樣品Npgsql的約束錯誤:

ERROR: 23503: update or delete on table "color" violates foreign key constraint "fk_order_detail__color" on table "order_detail"

+0

+1程序質量可以從其錯誤處理來判斷。對你有好處,試圖改善你的錯誤處理! – scraimer 2009-06-18 08:40:42

回答

2

你應該寫你的問題的方式,因此不會導致SQL錯誤。或者,如果您知道發生錯誤的具體原因,只需在界面中將其顯示爲消息,而不是錯誤。即「你應該刪除刪除這個對象之間的依賴關係」而不是「內部錯誤:不管」。

錯誤是意想不到的;你的約束錯誤不是。

+0

對於「錯誤是意外的事情;您的約束錯誤不是。」 – Hao 2009-06-18 08:39:53

+1

但是要完全公平:如果他有多個引用這個引用的表,那麼依賴於異常而不是檢查沒有引用是比較容易的。 – van 2009-06-18 08:57:44

+0

嗯,對於一次性腳本來說可能更容易一些,但它在成熟的應用程序中是不成熟的。他顯然應該找到這個錯誤的原因,並讓用戶照顧它,最好沒有SQL錯誤。 – alamar 2009-06-18 09:43:43

2

如果您想要更具體地處理某些錯誤,那麼理想情況下,您將創建一個ColorAlreadyUsedException class並將其丟棄。想想caller將如何區分這兩種情況:它是否需要檢查消息?

仍包含原始異常作爲內部異常。

4

您從您的例外中刪除信息而不記錄它。

我認爲這是一個糟糕的電話。
記錄消息以便能夠處理它,也不應該發生此錯誤。

重構,以便這不會再發生。

1

在我看來,當它已經有一個錯誤代碼時,依賴於消息的文本而頗爲片面。雖然至少在其他答案中概述的模式還有其他一些問題,但我會搜索「23503」而不是「外鍵約束」。否則,如果用戶的數據庫安裝位於不同的文化中,或者服務器的更新版本更改了消息的文本,會發生什麼情況?


其實看一些online documentation您正在使用它看起來像甚至有一個代碼屬性的異常類,這將是更快,更可靠的進行比較的不是消息屬性。


最後的想法...

我與範同意,你應該扔一個更具體的異常,當約束被打破,而且你不應該拋出Exception基時,錯誤的是別的東西。首先是拋出基本異常類從不是好的做法,因爲它不會給客戶端代碼提供任何有關錯誤的簡單可測試信息。其次,你正在失去很多信息,NpgsqlException實現的所有額外屬性以及堆棧跟蹤。我喜歡的東西取代投擲:

if (ex.Message.Contains("foreign key constraint")) 
    throw new ConstraintException("Cannot delete this, this record is already referenced on other record(s)"); 
else 
    throw; 

基本上,如果你不打算做任何富有成效的不同之處,然後不要去碰它,你永遠不知道什麼樣的信息代碼備份調用堆棧可能需要。