2010-09-15 41 views
1

我正在通過整個異常處理叢林進行顛簸,我現在試圖確定有多少try/catch我需要的塊,以及放置它們的位置。ASP.NET MVC2 - try/catch(throw?)塊的數量和位置

從我的控制器我有

CreateInvitation(fromUser, toUser); 

其中要求到我的BLL方法

public static Invitation CreateInvitaton(User fromUser, User toUser) 
{ 
    try 
    {// see if toUser exists, then create the invitation} 
    catch 
    {// throw something, maybe?} 
} 

我是不是真的需要這個方法重新把它扔?即使我不重新扔掉它,它會不會回到堆棧?

我是否還需要將控制器的調用包裝在try/catch塊中,或者是多餘的?

也許我根本不需要BLL方法中的try/catch塊,只需要我的控制器中的try/catch塊?

我正在看這裏的不少可能的組合,不知道什麼是正確的。

謝謝。

回答

1

捕獲例外當地當且僅當它們指示特殊行爲可以是固定的(或評論)在本地。

很難找到一個例子 - 這裏是一個:我有一些物體需要悲觀鎖。鎖定是因爲從Web應用程序寫入對象,而另一個(背景)應用程序正在讀取它可能會導致災難。這確實是一個例外,因爲它很少會發生。此外,我事先不做任何事情(因爲鎖可能是在下一行執行之前獲得的)。不過,我可以重試幾次,因爲我知道再次發佈對象的機會很大。儘管如此,所有這些都不是在控制器中發生的,而是在服務類中。

不要對預期條件使用異常(例如,無效輸入)。

此外,我同意web應用程序中的大多數例外都無法處理,除了記錄一條消息(應該在控制器中執行而不是)併發送一個錯誤頁面。最後,在捕捉異常時,確保正確執行此操作(捕獲特定的異常類型,使用throw;而不是throw ex;

+0

那麼沒有理由在控制器中有任何try/catch塊,呃? – asfsadf 2010-09-15 18:14:42

2

在您的示例中編寫的異常處理程序完全沒有任何功能。 (嗯,這是浪費時間的一點點,但它什麼都不做使用)

如果當時:然後將需要

try 
{...} 
catch 
{ 
    // do something here. 
    throw; 
} 

的try/catch語句&拋出。

+3

+1。在此擴展:除非需要添加對異常消息有意義的內容,否則不要使用try/catch。 99%的時間您應該允許異常一直到您的默認錯誤頁面並將其記錄到ELMAH之類的內容中。 – 2010-09-15 17:41:46

+0

謝謝。我只是使用該shell作爲更多的佔位符來表明我正在考慮將它放在哪裏。 – asfsadf 2010-09-15 17:42:49

+0

好吧,讓BLL try/catch模塊消失,並查看我的控制器中的任何錯誤? – asfsadf 2010-09-15 17:43:55