c# - 尝试在最后的陈述中捕获?

标签 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 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();
       }
    }
}

如果任务更新成功,文件就会被解锁,所以我最后就不用费心再做一次了。如果我遇到一些意想不到的错误,比如空引用(这种可能性很小,因为我检查任何可能为空并导致异常的东西,但让我们假装它以某种方式发生)。

我的 finally 声明将启动并确保文件处于解锁状态,当然网站会崩溃,用户会收到一些通用的“出错了错误”,但文件将被解锁,以便他们可以重试。

现在如果错误是 SqlException 错误会发生什么?它会被捕获,但 finally 语句仍然会运行,它也会在那里爆炸。

我是否应该将 finally block 中的代码包装在另一个 try catch 中?

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

最佳答案

从这种情况来看,您似乎并没有从 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
}

关于c# - 尝试在最后的陈述中捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234735/

相关文章:

swift - 响应式设计 : throw vs. 发布错误

java - 我对 FileWriter 使用什么 IOException

java - 没有 catch 或 finally block 的嵌套 try block

c# - 如何从 Windows 窗体 DateTimePicker 控件复制日期值?

c# - ToList()、Any()、Count()、Sum() 上的 Linq 错误

c# - DSN Util C#(不会创建)

c# - WIN32_Processor::ProcessorId 是否对所有计算机都是唯一的

c# - 为什么 Linq to Entity Select Method 翻转投影列表属性?

Python - 带可选对象的with语句

c# - 为什么 Visual Studio 不强制执行 try-catch-block 实现?