c# - 我应该使用异常来处理用户输入验证吗?

标签 c# asp.net-mvc asp.net-mvc-4

我正在将业务逻辑代码从 Controller 移动到业务类。我的页面需要大量的用户输入验证。这在我的代码中创建了许多嵌套级别。所以我在业务层重写了代码,如下所示:

    public RmaDetail SerialNumberScan(int rmaNumber, int serialNumber, RepairInvoice repairInvoice) {
    var result = SelectRmaDetail(rmaNumber, serialNumber);

    if (result != null) throw new BusinessException("Serial Number not found.");

    if (result.Received != 1) throw new BusinessException("Line item has not been received.");

    bool? workOrderClosed = WorkOrderClosed(result.LNSEQNBR, result.LNSEQNBR, serialNumber);

    if (!workOrderClosed.HasValue) throw new BusinessException("Work order not found.");

    if (workOrderClosed.Value == false) throw new BusinessException("Work order not closed.");

    repairInvoice.TerminalType = result.ITEMNMBR.Trim();
    repairInvoice.UnderWarranty = RepairInvoiceDataLayer.UnderWarranty(result.RETDOCID, result.LNSEQNBR, serialNumber, result.CUSTNMBR);

    return result;
}

这是我的 Controller :

    public ActionResult SerialNumberScan(string rmaNumber, string serialNumber)
{
    if (ModelState.IsValid)
    {
        ModelState["SerialNumber"].Value = new ValueProviderResult(serialNumber, serialNumber, CultureInfo.CurrentCulture);
        try
        {
            var rmaDetail = BusinessLayer.SerialNumberScan(rmaNumber, serialNumber, repairInvoice);
            Session["RmaDetail"] = rmaDetail;
            ViewBag.SetFocusTo = "#RepairLevels";
        }
        catch (BusinessException ex)
        {
            ViewBag.AlertMessage = ex.Message;
        }
    }

    return View("Index", repairInvoice);
}

线路ViewBag.AlertMessage是显示在我的页面顶部的一条消息。我喜欢这种方法,因为它非常可读。然而,我知道异常(exception)的代价是非常昂贵的。有更好的方法吗?

最佳答案

仅当您将异常作为正常程序流的一部分抛出时,异常才会变得昂贵。一般来说,异常应该用于处理异常情况,因此您的用例绝对符合条件:缺少序列号或行项目的情况确实是异常情况。

不过,我要更改的一件事是使用相同的异常(即 BusinessException)来处理所有验证。一方面,这使您的代码非常简单,因为您总是抛出相同的异常 - 唯一不同的是消息。另一方面,它剥夺了您以不同方式处理每种情况的灵活性。

我认为向 BusinessException 引入子类会带来更好的方法。添加新异常 - 在本例中为 MissingSerialNumberMissingLineItem 异常,使它们成为 BusinessException 的子类,以便您可以根据需要一起处理它们,并在抛出这些异常的地方使用无参构造函数。

关于c# - 我应该使用异常来处理用户输入验证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20381008/

相关文章:

C# 对象池与 Interlocked.Increment

c# - 如何使用 linq 表达式展平嵌套对象

javascript - MVC3::从详细信息 View 中导航表,而不是单击表中的详细信息链接

jquery - session 超时时调用 Ajax

javascript - 使用ajax将字符串数组传递给mvc Controller

c# - 如何根据某些条件创建对象

c# - 如何对 Entity Framework 进行单元测试?

c# - WPF DependencyProperty 抛出 InvalidOperationException

asp.net - 如何在 Asp.Net MVC 上学习用户的语言?

c# - POST 字符串到 ASP.NET Web Api 应用程序 - 返回 null