我正在将业务逻辑代码从 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
引入子类会带来更好的方法。添加新异常 - 在本例中为 MissingSerialNumber
和 MissingLineItem
异常,使它们成为 BusinessException
的子类,以便您可以根据需要一起处理它们,并在抛出这些异常的地方使用无参构造函数。
关于c# - 我应该使用异常来处理用户输入验证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20381008/