【问题标题】:best Approach for Catching exception from my model class从我的模型类中捕获异常的最佳方法
【发布时间】:2013-08-02 04:28:53
【问题描述】:

我不知道应该在我的 asp.net mvc Web 应用程序中捕获异常的内容/位置/时间。以及如何为最终用户显示错误消息。例如,我得到了以下 Action 方法:-

    [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);但是控制器操作方法是从我的存储库模型类中调用这些服务方法的最佳位置吗?

  2. 目前如果服务方法失败,我正在手动写入模型状态错误并将视图返回给用户。那么这是为服务方法编写模型状态错误的正确方法吗?

  3. 如果引发了 DBUpdateException,我假设数据库中已经存在 IP 或服务名称(如果服务方法无法检查高流量应用程序,则可能会发生这种情况)。但是引发 DBUpdateException 的原因还有很多。所以我的问题是关于处理 DBUpdateException 的最佳方法是什么。并准确说明提出它的原因?

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework


    【解决方案1】:

    控制器通常是进行模型状态验证的正确位置,但是,正如我发现的那样,如果您要进行大量验证,那么它很容易使控制器膨胀。

    我如何处理验证繁重的控制器方法是将验证导出到服务,例如称为 ValidateServer(serverToEdit) 的静态方法。

    然后在这个方法中,运行你所有的各种检查,并建立一个名为errors的字典,如果检查失败,则向这个字典添加一个错误。

    然后您可以将此字典传递回您的控制器,并使用 foreach 将错误添加到 ModelState。这样就只剩下你的异常处理了。

    为了在您的 DBUpdateException 上提供用户信息,您应该能够通过异常 .InnerException 属性获取有关它发生原因的信息,您可以将其作为错误消息传递给用户。所以你会写:

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

    或者类似的东西!

    【讨论】:

    • 感谢您的回复。但我认为 ex.InnerException 将包含技术错误描述。那么向用户显示此错误是否正常,或者在向用户显示之前处理这些错误会更好。
    【解决方案2】:

    不要将验证与异常处理混为一谈。

    在一个集中的地方处理异常并将错误记录并显示给最终用户更有意义。这样,您可以使您的代码更具可读性和可维护性。 CodeProject 在这个主题上有a great article

    【讨论】:

    • 您的链接已失效
    【解决方案3】:

    我认为您可以添加另一层来包装调用并返回带有某种状态和错误(如果有)的结果,并在返回消息失败的情况下使用 modelstate,这样您的控制器将更具可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2012-10-10
      • 2010-09-10
      • 2012-02-12
      相关资源
      最近更新 更多