尝试在c# Windows应用程序中捕获问题

本文关键字:问题 应用程序 Windows | 更新日期: 2023-09-27 18:07:26

当我执行程序时,如果存在项

,则执行必须进入catch
con2=new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0DataSource=e:''convert.accdb" + "; Persist Security Info=False");
OleDbCommand cmd = new OleDbCommand(sql, con2);           
con2.Open();           
try {
  cmd.ExecuteNonQuery();
  con2.Close();
  MessageBox.Show("Thanks");
}
catch (Exception ex) {
  MessageBox.Show(ex.Message);
  con.Close();
}

尝试在c# Windows应用程序中捕获问题

catch部分将仅在try块内存在错误时进行评估。因此,如果调用导致异常,那么它将落入该块,或者如果你引发一个异常,它也将落入该块。

ExecuteNonQuery返回一个int,因此,如果您想在返回值大于0时抛出异常,那么执行以下操作:

con2.Open();
try {
  if (cmd.ExecuteNonQuery() > 0) {
    throw new Exception("More than zero rows affected");
  }
  con2.Close();
  MessageBox.Show("Thnaks");
}
catch (Exception ex) {
 MessageBox.Show(ex.Message);
 con.Close();
}

但即使这样,还有很多需要改进的地方。例如,您可以使用finally来管理连接(以及您的命令,因为它们也是一次性的):

try {
  if (cmd.ExecuteNonQuery() > 0) {
    throw new Exception("More than zero rows affected");
  }
  MessageBox.Show("Thanks");
}
catch (Exception ex) {
 MessageBox.Show(ex.Message);
}
finally {
  con.Close();
  con2.Close();
  cmd.Close();
}

更进一步,你确定要使用异常来处理执行流吗?这通常是不受欢迎的,因为例外,就其名称而言,是在特殊情况下考虑的。

听起来你在找这样的东西。您需要捕获SqlException,然后遍历它的Errors集合以找到与您期望的错误匹配的消息。

try
{
  cmd.ExecuteNonQuery();
  con2.Close();
  MessageBox.Show("Thanks");
}
catch (SqlException ex)
{
   for (int i = 0; i < ex.Errors.Count; i++)
   {
        if (ex.Errors[i].Message.Contains("There is already an object named"))
        {
             /* Handle duplicate situation here */
             break;
        }
   }
}
catch (Exception ex)
{
  MessageBox.Show(ex.Message);
  con.Close();
}