关于异常处理

时间:2013-02-18 10:24:18

标签: c# exception-handling

在以下代码中,如果使用cmd3传递的cmd1和cmd2失败。 do c#abort all block(try block)?,或继续执行cmd1和cmd2?。

              try
            {

                sqlConnection1.Open();
                cmd1.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();
                cmd3.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                MessageBox.Show("An error occured " + ex.Message);
            }

            finally
                {
                    sqlConnection1.Close();
                }

4 个答案:

答案 0 :(得分:1)

cmd1和cmd2将在您指定的方案中执行,并且异常处理将捕获cmd3上的异常。

要实现cmd3失败时中止cmd1和cmd2的行为,您可以将所有sql命令放在一个存储过程中并使用TRANSACTION and ROLLBACK

答案 1 :(得分:0)

根据您的方案,cmd1和cmd2将执行,如果有execption,那么它将进入catch块。如果cmd1失败,那么它将不执行cmd2和cmd3并将进入catch块。另外值得阅读此链接here

答案 2 :(得分:0)

cmd1和cmd2将被执行,因为try / catch块不会自动执行查询事务。但是,如果cmd3失败,您可以使用transaction scope执行回滚并撤消cmd1 / cmd2中所做的更改。

答案 3 :(得分:0)

当抛出异常时,代码停止跳转到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
   }
}

如果未执行statemenet trans.Complete(),则会回滚对数据库所做的任何更改。

相关问题