2013-08-01 45 views
2

我迷失在什麼/哪裏/何時應該在我的asp.net mvc web應用程序中捕獲異常。以及如何爲最終用戶顯示錯誤消息。例如我得到了以下操作方法: -從我的模型類捕捉異常的最佳方法

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(ServerToEdit serverToEdit) 
     { 
try 
     { 
     if (ModelState.IsValid) 
     { 
     if (!(repository.IsIPUnique(serverToEdit.TechnologyIP.IPAddress, 0))) 
     { 
     ModelState.AddModelError("TechnologyIP.IPAddress", "Error occured. The Same IP might already assinged."); 

          return View(serverToEdit); 
     } 
     if (!(repository.IsServerNameUnique(serverToEdit.Server.Name, 0))) 
     { 
     ModelState.AddModelError("Server.Name", "Error occured. The Same Server Name might already assinged."); 

          return View(serverToEdit); 
         } 
         repository.InsertOrUpdateServer(serverToEdit.Server,serverToEdit.TechnologyIP,User.Identity.Name); 
         repository.Save(); 
         return RedirectToAction("Index"); 
        } 

     else 
     { 
     return View(serverToEdit); 
     } 
     } 
    catch (DbUpdateException) 
     { 
     ModelState.AddModelError(string.Empty, "Error occured. The Same IP/Name might already assinged."); 

     } 
    catch (DbEntityValidationException) 
        { 
         ModelState.AddModelError(string.Empty, "Error occured. User might not be defiend inside Active Directory."); 

        } 
     return View(serverToEdit); 
     } 

我有一個關於我的代碼如下問題: -

  1. 我有兩個服務的方法(IsIPUnique & IsServeNameUnique);但是Controller操作方法是從我的存儲庫模型類中調用這些服務方法的最佳位置?

  2. 當前如果服務方法失敗,我手動編寫模型狀態錯誤並將視圖返回給用戶。那麼這是爲服務方法編寫模型狀態錯誤的正確方法嗎?

  3. 如果引發DBUpdateException,我假設IP或serve-name已存在於數據庫中(如果服務方法無法檢查高流量應用程序,則可能發生這種情況)。但DBUpdateExceptio有很多其他原因需要提出。所以我的問題是關於什麼是處理DBUpdateException的最佳方法。並顯示它被提出的原因是什麼?

回答

1

我想你可以添加其他層封裝了電話,並找回了一些狀態,如果任何錯誤的結果,並與返回的消息失敗的情況下使用的ModelState,這樣您的控制器將更具可讀性。

2

控制器通常是進行模型狀態驗證的正確位置,但正如我發現的那樣,如果您正在進行大量驗證,那麼它可能會使控制器容易膨脹。

我如何處理驗證繁重的控制器方法是將驗證導出到服務,比如稱爲ValidateServer(serverToEdit)的靜態方法。

然後在這個方法裏面,運行你所有的各種檢查,並建立一個名爲errors的字典,如果檢查失敗,給這個字典添加一個錯誤。

然後,您可以將此字典傳回給您的控制器,並使用foreach將錯誤添加到ModelState中。然後這隻會讓你處理異常。

爲了提供DBUpdateException中的用戶信息,您應該能夠通過例外.InnerException屬性獲取有關其發生原因的信息,您可以將該屬性作爲錯誤消息傳遞給用戶。所以你會寫:

catch (DbEntityValidationException ex) 
       { 
        ModelState.AddModelError(string.Empty, "Error occurred:" + ex.InnerException); 

       } 

或沿着這些線路的東西!

+0

感謝您的回覆。但我認爲ex.InnerException將包含一個技術錯誤描述。所以向用戶顯示該錯誤是正常的,或者在將這些錯誤顯示給用戶之前,它們將很好地處理這些錯誤。 –

2

不要混合驗證和異常處理。

在一個集中的地方處理異常並記錄並向最終用戶顯示錯誤更有意義。這樣,您可以使您的代碼更具可讀性和可維護性。 CodeProject在這個主題上有a great article