gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:11 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com