C# 在最后的陈述中尝试捕捉?
我有一个asp.net mvc 3站点,当一个人编辑一个任务时,它会锁定该任务,以便他们可以编辑它,并确保其他订阅者在编辑任务时不会删除或更新该任务 他们点击任务上的编辑,它就会去抓取任务并锁定它。他们编辑任务并进行更新 现在我有了这样的东西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
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语句。一个是检查用户是否存在,另一个是仔细检查他们是否获得了实际编辑任务的权限(当任务第一次加载时,我检查他们是否可以编辑任务,但没有任何东西是人们试图直接转到更新方法的原因)。这就是为什么我做了两次。最后是一种盲解锁,即使可能并不总是需要。是的,我有,但希望有更好的方式比国旗。