2010-06-24 88 views
1

我知道這樣做並不好,只要在Exception上加上try catch就可以了,因爲這可能導致隱藏問題和其他問題。我應該捕捉異常嗎?

但是,我仍然不知道我是否應該這樣做在我的情況。

我的網站是沉重的ajax,所以我發回json響應。所以,現在我已經確定了可以提出像一個空引用,SQL數據庫等一些可能的例外

因此,在這些的的catch語句我有一個很好的消息給用戶類似

發生了數據庫錯誤您 東西尚未保存

但是我想,如果他們是一些其他的例外,我不明白現在發生了什麼。如果發生這種情況,我認爲表單會掛起,用戶不知道發生了什麼。

所以會是在這種情況下更好的,我確定 - 如SQL

  • 捕獲異常,outof範圍
    • 日誌與ELMAH
    • 顯示漂亮的定製味精每個異常
  • 捕獲異常後
    • 用elmah記錄
    • 顯示一些通用信息
    • 回來並添加該例外列表。

catch(IndexOutOfRangeException ex) 
{ 
    // log here 
    // customized msg 
} 

回答

0

隱藏異常不是一個好主意,因爲它會隱藏代碼的錯誤,並且不會讓您明白什麼是錯誤的。不是所有的錯誤都應該顯示給那些使用這些知識來附加你的網站的用戶。

與其向用戶顯示錯誤,我會將其記錄在數據庫或文件中;您可以向用戶顯示錯誤消息,但錯誤消息可能只有您知道它意味着什麼的代碼。這是從緩存服務器完成的,它會向用戶返回一個名爲guru冥想的錯誤代碼。

我的答案是:抓住所有的例外,即使是你不認爲可以提出的例外。這將允許您控制用戶會看到的錯誤消息。

+0

那是我的意圖。我不會給他們一些堆棧軌道。因爲我登錄ELMAH(一個錯誤記錄工具),所以我也沒有隱藏每個說的錯誤消息,所以我會知道它。這只是我在想,如果我沒有捕捉到所有的例外,並且我忘記了用戶可能會在黑暗中離開。我仍然會知道ELMAH發生了什麼事,但用戶不會。所以這就是爲什麼我認爲捕獲所有例外作爲最後手段顯示我自己的味精給用戶。一旦我看到它看到發生了什麼,並可能增加另一個捕獲。 – chobo2 2010-06-24 01:13:02

+0

我的意思是可以向用戶顯示錯誤信息,但錯誤不應該給你正在使用的軟件提供任何提示,以避免這些細節可以用於附加你的網站。在一些地方,代碼應該捕獲所有剩下的異常,以允許您控制用戶將看到的消息。登錄的用戶不知道查詢「SELECT * FROM drupal.users WHERE name ='xyz'」失敗;他們只需要知道服務器端存在錯誤,他們需要稍後再試。 – kiamlaluno 2010-06-24 01:24:38

+0

那麼我的郵件就像是「由於數據庫錯誤而無法保存您的信息」或「由於未知錯誤而無法保存您的信息」。 – chobo2 2010-06-24 01:30:11

3

所以

catch(IndexOutOfRangeException ex) 
{ 
    // log here 
    // customized msg 
} 
catch(Exception ex) 
{ 
    // log here 
    // generic msg 
    // come back and add another exception later on what actually failed. 
} 

,而不是在低級別的代碼它通常是不好的形式捕獲異常那裏。理論上你希望他們被拋出,所以你知道什麼時候出現問題。通常最好捕捉那些你知道會發生的事,並處理它們。然後以更高的水平捕捉未處理的。

+0

嗯,我沒有使用任何低級代碼。另外,我正在使用我記錄所有捕獲到的異常。所以我不確定我是否很難打電話說不,我不會記錄它,因爲潛在的用戶可能會坐在那裏想知道發生了什麼。 – chobo2 2010-06-24 01:05:56

+1

當我看到低級別時,我的意思是方法級別的實現代碼,如您所示。 – 2010-06-24 01:08:58

0

找出您知道可以處理或執行某些操作的異常,並採取適當的措施來糾正問題。

如果意外情況異常,請記錄儘可能多的信息並通知用戶。

一般來說,用戶不關心它是數據庫錯誤還是文件寫入權限錯誤等等。他們需要被告知的是出了點問題。

我想我的觀點是,如果你打算做一些與這些異常有關的特定事情,你應該只捕獲特定的異常,否則應該只需要處理未知的Exception類的一般catch。

0

如果你想讓程序的不同部分來處理它,你可以捕獲異常,記錄它,然後重新拋出它。或者你可以讓它冒泡並記錄下來,如果你願意的話,可以在更高層次上處理它。