关于异常处理
本文关键字:异常处理 | 更新日期: 2023-09-27 17:59:57
在以下代码中,如果cmd1和cmd2通过,cmd3失败。c是否中止所有块(try块)?,或者继续执行cmd1和cmd2?。
try
{
sqlConnection1.Open();
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
cmd3.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("An error occured " + ex.Message);
}
finally
{
sqlConnection1.Close();
}
cmd1和cmd2将在您指定的场景中执行,cmd3上的异常将被异常处理捕获。
要实现在cmd3失败时中止cmd1和cmd2的行为,您需要将所有sql命令放在一个存储过程中,并使用TRANSACTION和ROLLBACK
给定您的场景cmd1和cmd2将执行,如果有execoption,那么它将转到catch块。如果cmd1失败,那么它将不会执行cmd2和cmd3,并将转到catch块。此外,值得阅读此处的链接
cmd1和cmd2将被执行,因为try/catch块不会自动对查询执行事务。但是,如果cmd3失败,您可以使用事务作用域执行回滚并撤消在cmd1/cmd2中所做的更改。
当抛出异常时,代码停止跳到nearst catch块。
任何低于异常发生点的代码都不会执行。
在你的senario中,也许你想考虑像这样使用TransactionScope
:
using(var trans = new TransactionScope())
{
try
{
//your setup code goes here
sqlConnection1.Open();
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
cmd3.ExecuteNonQuery();
trans.Complete();
}
catch(Exception)
{
//handle exception
}
}
如果未执行状态集trans.Complete()
,则对数据库所做的任何更改都将回滚。