C# 在最后的陈述中尝试捕捉?

C# 在最后的陈述中尝试捕捉?,c#,try-catch,C#,Try Catch,我有一个asp.net mvc 3站点,当一个人编辑一个任务时,它会锁定该任务,以便他们可以编辑它,并确保其他订阅者在编辑任务时不会删除或更新该任务 他们点击任务上的编辑,它就会去抓取任务并锁定它。他们编辑任务并进行更新 现在我有了这样的东西 public Task Update(Task task) { isLocked = true; try { // set task to unlock itself(this is stored on the ta

我有一个asp.net mvc 3站点,当一个人编辑一个任务时,它会锁定该任务,以便他们可以编辑它,并确保其他订阅者在编辑任务时不会删除或更新该任务

他们点击任务上的编辑,它就会去抓取任务并锁定它。他们编辑任务并进行更新

现在我有了这样的东西

public Task Update(Task task)
{
    isLocked = true;
    try
    {
        // set task to unlock itself(this is stored on the task row in the db)
        task.locked = false
        task.DateLocked = "6/3/1900";
        task.Commit(); // save the newly updated task; - nhibernate

        isLocked = false;
        return task
    }
    catch(SqlException ex)
    {
        // error logging here
       // "database is down error to user"
    }
    finally
    {
       if(isLocked)
       {
          task.locked = false
          task.DateLocked = "6/3/1900";
          task.Commit();
       }
    }
}
如果任务被成功更新,文件将被解锁,这样我就不用在最后一次更新时再麻烦了。如果我遇到了一些意外的错误,比如空引用(不太可能,因为我检查了任何可能为空并导致异常的内容,但让我们假装它以某种方式发生)

我的最后一个声明将启动并确保解锁中的文件当然,网站会爆炸,用户会得到一些通用的“出错错误”,但文件将被解锁,以便他们可以重试

现在,如果错误是SqlException错误,会发生什么?它会被抓到,但最后的声明仍然会运行,它也会在那里爆炸

我应该在另一个try-catch中包装finally块中的代码吗


我确实有一个定期运行的计划任务,以确保任务最终将被解锁,因此,如果像数据库关闭一样,任务不会永远被锁定,它最终应该被解锁。

您是否考虑过简单地设置一个标志,以指示捕捉到SQLException并在finally块中,检查该标志并随后采取适当的操作…

在这种情况下,再次运行commit语句似乎不会给您带来多少好处。您可以执行类似的操作来处理以下db-only异常:

public Task Update(Task task)
{
    isLocked = true;
    try
    {
        //DO OTHER STUFF HERE
    }
    catch(Exception ex)
    {
        // error logging here
    }
    finally
    {
        UpdateToDB(task)
    }
    return task;
}

private Task UpdateToDB(Task task)
{
    try
    {
        task.locked = false
        task.DateLocked = "6/3/1900";
        task.Commit();     
    }
    catch(Exception e)
    {
        //LOG ERROR
    }
    catch(SqlException ex)
    {
       //LOG ERROR
       // "database is down error to user"
    }
    isLocked = false;
    return task
}

你不需要假装,异常确实会以某种方式发生:原因是我有几个if语句。一个是检查用户是否存在,另一个是仔细检查他们是否获得了实际编辑任务的权限(当任务第一次加载时,我检查他们是否可以编辑任务,但没有任何东西是人们试图直接转到更新方法的原因)。这就是为什么我做了两次。最后是一种盲解锁,即使可能并不总是需要。是的,我有,但希望有更好的方式比国旗。