【问题标题】:Best way to handle exception prior to updating database在更新数据库之前处理异常的最佳方法
【发布时间】:2018-11-20 20:19:54
【问题描述】:

我需要在更新我的数据库之前检查输入是否有效。

我创建了一个 bool 方法来检查它是否有效。

private bool validProject(string ProjectID)
{
    using (AXEntitiesDEV db = new AXEntitiesDEV())
    {
        return db.PROJTABLEs.Any(c => c.PROJID==ProjectID);

    }
}

并且正在我的更新方法中检查它。

 protected void Insert(object sender, EventArgs e)
    {
        using (GPSE2Entities entities = new GPSE2Entities())
        {
            TextBox txtEditTime = (TextBox)gvDailyGPS.FooterRow.FindControl("txtFooterTime");
            DropDownList ddlEventDateOnly = (DropDownList)gvDailyGPS.FooterRow.FindControl("ddlFooterDateOnly");
            DateTime EDT = DateTime.Now;
            TextBox txtAddProjectID = (TextBox)gvDailyGPS.FooterRow.FindControl("txtAddProjectID");
            validProject(txtAddProjectID.Text);
            DailyGPSTable newLOB = new DailyGPSTable
                {
                    EventDateTime = EDT,
                    Project = txtAddProjectID.Text,
                };

                entities.DailyGPSTables.Add(newLOB);
                {
                    entities.SaveChanges();
                    BindGrid();
                }
                entities.SaveChanges();
            }
    }

我尝试捕获并报告错误,但它允许在 false 时进行无效输入。

try
{
    validProject(txtAddProjectID.Text);
}
catch (ArgumentException)
{
    addErr.Text = "";

    addErr.Text = "Invalid Project ID.";
}

在尝试插入之前,我可以捕获并报告错误的最佳方法是什么?

【问题讨论】:

  • 当您可以简单地获取返回值并设置错误文本没有任何问题时,为什么要抛出一个代价高昂的异常?
  • 这似乎是XY problem
  • 如果此条件(其中之一)为真,我需要停止处理数据库插入。
  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅How to Ask 页面以获得澄清此问题的帮助。
  • @DougFarrell 除非你用minimal reproducible example 更好地解释实际问题,否则那些试图帮助你的人将无法正确解决问题。

标签: c# boolean try-catch


【解决方案1】:

你可以抛出你自己的异常:

try
{
    if (!validProject(txtAddProjectID.Text))
        throw new ArugmentExceptioN(txtAddProjectID.Text);
}
catch (ArgumentException)
{
    addErr.Text = "";
    addErr.Text = "Invalid Project ID.";
}

但不要那样做!

你已经有一个布尔值告诉你函数失败了。只需将其与普通的 if 块一起使用即可:

if (!validProject(txtAddProjectID.Text))
{
    addErr.Text = "";
    addErr.Text = "Invalid Project ID.";
}

这只是更新数据库之前必须满足的众多条件之一

仍然不需要例外。

bool validRecord = true;

validRecord = validRecord && validProject(txtAddProjectID.Text);
validRecord = validRecord && someOtherCheck();
validRecord = validRecord && someFinalCheck();
validRecord = validRecord && howEverManyYouNeed();

if (!validRecord)
{
    ShowError();
}
else
{
    UpdateDB();
}

您可以通过附加到字符串或添加到以空开头的列表来执行类似的操作。最后,如果项目有任何长度,则显示错误。

【讨论】:

  • 是的,但这只是更新数据库之前必须满足的众多条件之一
  • 乔尔,感谢您的回答,我会尝试并让您知道结果。只是为了我的信息,你能告诉我为什么这比抛出异常更好吗?
  • @DougFarrell 异常代价高昂,实际上应该只在特殊情况下抛出(双关语)。检查这篇文章stackoverflow.com/questions/891217/…
【解决方案2】:
try
{
  validProject(txtAddProjectID.Text);
}
catch (ArgumentException e)
{
  addErr.Text = "";

  addErr.Text = e.Message;
}


private static void validProject(object text)
{
  throw new ArgumentException($"Invalid Project ID.{text}");
}

【讨论】:

  • 每次调用validProject() 时都会抛出异常。 OP 要求它仅在 validProject() 返回 false 时抛出异常。
【解决方案3】:

只要检查validProject的调用结果,如果返回false就抛出异常:

try
{    
    if (!validProject(txtAddProjectID.Text))
        throw new ArgumentException("Argument is invalid", nameof(txtAddProjectID.Text));
}
catch (ArgumentException)
{
    addErr.Text = "";

    addErr.Text = "Invalid Project ID.";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多