尝试抓住最终声明?

问题描述

| 我有一个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();
       }
    }
}
如果任务成功更新,则文件将被解锁,因此我不会在最后再麻烦一次。如果我遇到一些意外错误,例如null引用(我不太可能检查任何可能为null并导致异常的东西,但假装它以某种方式发生)。 我的finally语句将开始执行,并确保打开该文件的权限当然会使该站点崩溃,并且用户将收到一些通用的“出错错误”,但该文件将被解锁,因此他们可以再次尝试。 现在,如果错误sqlException错误怎么办?它会被捕获,但是final语句仍然会运行,并且在那里也会爆炸。 我是否应该在另一个try catch中将代码包装在我的finally块中? 我确实有一个调度的任务经常运行,以确保最终将任务解锁,因此,如果它像数据库关闭一样,就好像任务永远不会被锁定,最终应该被解锁。     

解决方法

        从这种情况来看,您似乎再一次无法通过再次运行commit语句而受益匪浅。您可以执行以下操作来处理仅db异常:
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
}
    ,        您是否考虑过简单地设置标志以指示已捕获SQLException并在finally块中检查该标志并随后采取适当的措施...