尝试在c# Windows应用程序中捕获问题
本文关键字:问题 应用程序 Windows | 更新日期: 2023-09-27 18:07:26
当我执行程序时,如果存在项
,则执行必须进入catchcon2=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();
}
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();
}