如何解决尝试抓住最终声明?
| 我有一个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块中检查该标志并随后采取适当的措施...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。