关于异常处理

本文关键字:异常处理 | 更新日期: 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(),则对数据库所做的任何更改都将回滚。