【问题标题】:C# try catch confusionC#尝试捕捉混淆
【发布时间】:2013-11-14 05:42:23
【问题描述】:

我对 C# 很陌生。

当我尝试捕捉这样的东西时:

try
{
    connection.Open();
    command.ExecuteNonQuery();
}
catch(SqlException ex)
{
    MessageBox.Show("there was an issue!");
}

我如何知道问题是否发生在OpenExecuteNonQuery
如果我在Try 中调用了一堆其他non-SQL 的东西怎么办?
我怎么知道哪个失败了?
SqlException 比普通的 Exception 是什么意思?
如果Try 块中有这样的代码,SqlException 将如何处理与 SQL 无关的错误?

【问题讨论】:

  • 您可以从堆栈跟踪中获取行号(但并非在所有情况下),并从异常中获取堆栈跟踪。但这是一种非常脆弱的方法,请勿将其用于应用程序逻辑。
  • try catch 是面向异常设计的,因此您可以追溯异常,但不能追溯语句。

标签: c# sqlexception


【解决方案1】:

您可以通过捕获SQL的异常来查看您的异常发生在代码的哪一部分

try
{
    connection.Open();
    command.ExecuteNonQuery();
}
catch(SqlException ex) // This will catch all SQL exceptions
{
    MessageBox.Show("Execute exception issue: "+ex.Message);
}
catch(InvalidOperationException ex) // This will catch SqlConnection Exception
{
    MessageBox.Show("Connection Exception issue: "+ex.Message);
}
catch(Exception ex) // This will catch every Exception
{
    MessageBox.Show("Exception Message: "+ex.Message); //Will catch all Exception and write the message of the Exception but I do not recommend this to use.
}
finally // don't forget to close your connection when exception occurs.
{

connection.Close();

}

无效操作异常:

根据 MSDN:如果不指定数据源或服务器,则无法打开连接。 或者 连接已打开。

我不建议您将整个 Exception message 写入 UI,因为它更容易被黑客攻击 SQL 数据库

SqlException根据MSDN

只要用于 SQL Server 的 .NET Framework 数据提供程序遇到从服务器生成的错误,就会创建此类。 (客户端错误作为标准公共语言运行时异常抛出。)SqlException 始终包含至少一个 SqlError 实例。

【讨论】:

  • 你真的想将Exception ex 连接到MessageBox.Show("General exception"+ex); 中的字符串吗?
  • ex.Message 会更好
  • InvalidOperationException 捕捉其他操作抛出的其他异常。我不认为 catch 会做他想做的事。
【解决方案2】:

你可以在try块之后添加多个catch

try
{
    connection.Open();
    command.ExecuteNonQuery();
}
catch(SqlException ex)
{
    MessageBox.Show("there was an issue!");
}
catch(Exception ex)
{
    MessageBox.Show("there was another issue!");
}

这里的重要规则是捕捉最具体的异常并捕捉更普遍的异常

如果我在 TRY 中调用了一堆其他非 SQL 的东西怎么办? 我怎么知道哪个失败了?

这将基于操作引发的异常。就像我说的那样,首先捕获最具体的异常,然后在下降时变得更一般。我建议您查看 MSDN 文档,了解您认为可能引发异常的方法。本文档详细说明了在哪些情况下方法会引发哪些异常。

SQLEXCEPTION 相对于常规 EXCEPTION 意味着什么?

SQLException 是普通Exception 类的扩展,仅在特定情况下抛出。

SqlException

如果我在 TRY 块中有这样的代码,SQLEXCEPTION 将如何处理与 SQL 无关的错误?

所以为了回答您的问题,您设置的块不会捕获任何不是SQLException 或扩展SQLException 的异常。

【讨论】:

    【解决方案3】:

    尝试抓住

    在C#应用中实际使用连接数据库

    试试
    {
    字符串 conString = ConfigurationManager.ConnectionStrings["ldr"].ConnectionString;
    使用 (SqlConnection con = new SqlConnection(conString))
    {
    使用 (SqlCommand cmd = new SqlCommand("StuProc", con))
    {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@First", firstname.Text);
    cmd.Parameters.AddWithValue("@Last", lastname.Text);
    cmd.Parameters.AddWithValue("@Phone", phonebox.Text);
    cmd.Parameters.AddWithValue("@Email", emailbox.Text);
    cmd.Parameters.AddWithValue("@isC#Intrest", csharExperties.Checked);
    cmd.Parameters.AddWithValue("@isJavaIntrest", javaExperties.Checked);
    cmd.Parameters.AddWithValue("@isVBIntrest", VBExperties.Checked); con.Open();
    cmd.ExecuteNonQuery(); DialogResult result = MessageBox.Show("Your Data is Store", "Succeded", MessageBoxButtons.OK, MessageBoxIcon.Information);
    切换(结果)
    {
    案例 DialogResult.OK:
    ClearScreen();
    休息;
    }
    }
    }
    }
    捕获(异常前)
    { MessageBox.Show("问题:", ex.Message);
    }
    }

    如果您的连接中有任何错误,例如配置、过程、参数 然后初始化然后他会警告你你在这方面的错误

    【讨论】:

    • 这看起来像是一堆几乎不相关的代码,实际上并没有回答问题中的任何内容。
    【解决方案4】:

    快速回答是,您可以有许多 catch() 部分来捕获特定异常。

    try{
    }
    catch (SqlException sqlEx)
    {
        //deal with sql error
    }
    catch (NullArgumentException)
    {
        //Deal with null argument
    }//etc
    finally
    {
        //do cleanup
    }
    

    您真正想做的是将重点放在可能发生的特定异常的尝试中。您还希望在边界代码周围使用 try-catch 块(您无法控制发生的情况)并优雅地处理您自己的错误。

    【讨论】:

      【解决方案5】:

      要进一步确定问题,您可以使用以下语法:

      try
      {
          connection.Open();
          command.ExecuteNonQuery();
      }
      catch(Exception ex)
      {
          MessageBox.Show("Error:" + ex.Message); // This will display all the error in your statement.
      }
      

      【讨论】:

        【解决方案6】:

        您可以为单个 try 块使用多个 catch 块来处理不同的可能异常。
        如果您使用异常并为该异常打印消息,那么您的应用程序将不会中断,但会显示已发生异常的消息。实际上每个catch块都会定义不同的异常,只有当你确定特定类型的异常可能发生时,你才能编写特定异常的catch块。否则声明一个像catch(Exception ex) 这样的单个catch 块,它将被捕获任何类型的异常并使用ex.toString() 消息跟踪错误。您还可以在 try 块中使用断点来获取导致异常的特定行。

        try
        {
        connection.Open();
        command.ExecuteNonQuery();
        }
        catch (NullArgumentException ex)
            {
            //Deal with null argument
             ex.toString();
            }
        catch (NumberFormatException ex)
            {
            //Deal with null argument
            ex.toString();
            }
        catch(SqlException ex)
           {
            MessageBox.Show("there was an issue!");
           }
        catch(Exception ex)
           {
            MessageBox.Show(""+ex.toString());
           }
        

        谢谢

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-10
          • 1970-01-01
          • 2020-04-02
          • 1970-01-01
          • 2010-11-23
          • 2013-08-04
          相关资源
          最近更新 更多