2011-06-04 70 views
2

我有一个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块中的代码吗?

我确实有一个计划任务,每隔一段时间运行一次,以确保任务最终将被解锁,因此如果它像数据库关闭一样,它不像任务被永久锁定,它最终应该被解锁。

+0

你不需要伪装,异常就莫名其妙地发生了:d – TheVillageIdiot 2011-06-04 04:44:18

回答

2

从你的情况似乎并不越来越最后再次运行提交语句很有好处。你可以做这样的事情来处理数据库唯一的例外是这样的:

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 
} 
+0

那么原因是我有几个如果发言。一个检查用户是否存在,一个检查他们是否获得了实际编辑任务的权限(当任务首次加载时,我检查他们是否可以编辑任务,但是没有人试图直接转到更新方法)。所以这就是为什么我做了两次。即使可能并不总是需要,最后也是一种盲解。 – chobo2 2011-06-04 05:01:49

0

你有没有考虑简单地设置一个标志,以表明被抓SQLException的,并在finally块,检查该标志,并随后采取适当行动......

+0

是的,我有,但希望更好的方式则标志。 – chobo2 2011-06-05 21:03:41