【问题标题】:SqlException not caught in WinformsSqlException 未在 Winforms 中捕获
【发布时间】:2016-02-03 19:03:50
【问题描述】:

我得到了这个代码:

try
{
    using (SqlConnection sourceCnx = new SqlConnection(SOURCE_CONN_STRING))
    {
        sourceCnx.Open();
        SqlCommand sysCmd = sourceCnx.CreateCommand();
        sysCmd.CommandText = "My query";
        sysCmd.ExecuteNonQuery();
    }
}
catch (Exception)
{
    //Throwing a message box informing that there is an error
}

我想在用户不再连接到互联网时显示一条消息。 但是,当我在没有 Internet 连接的情况下调试程序时,程序会因 SqlException 而崩溃。 (“catch”块没有捕获异常)

我尝试在catch (Exception) 之前添加catch (SqlException) { // code },但它不起作用。 我仍然有一个异常,而不是 catch 块显示的消息。

我不知道该怎么做,因为如果我创建一个方法来测试互联网连接(try ping google.com)然后返回 true,如果没问题,它会是一样的:我有一个异常,因为没有互联网连接。

有什么想法吗?

【问题讨论】:

  • 您确定异常是从该try 块中引发的吗? catch 块将捕获异常。 (旁注:您的异常处理忽略了有关异常的有用信息。至少您应该检查异常的类型、错误消息和堆栈跟踪。丢弃有关错误的信息将使修复错误变得非常困难。 )
  • 是的,Visual Studio 告诉我 sourceCnx.Open(); 行是异常的原因。我也试过写catch (Exception ex) { var excep = ex.GetType().FullName; }但是没有到达catch块。
  • 在调试模式下你是否只是打破所有异常?
  • 我不明白你的问题,对不起..我的英语不太流利,请见谅。
  • 删除该复选框,异常将首先到达您的 catch 块。当未处理时,(没有 catch 块,它会导致你的应用程序崩溃)然后只到调试器。

标签: c# sql winforms exception try-catch


【解决方案1】:

在catch代码的部分,你要设置一个变量不是吗?然后拿走她的任何财产。

例如:

try
{
using (SqlConnection sourceCnx = new SqlConnection(SOURCE_CONN_STRING))
    {
        sourceCnx.Open();
        SqlCommand sysCmd = sourceCnx.CreateCommand();
        sysCmd.CommandText = "My query";
        sysCmd.ExecuteNonQuery();
    }
} 
catch (Exception ex) 
{ 
      //example 
      MessageBox.show(ex.message);
}

【讨论】:

  • 我没看懂你写的东西,但我试过你的代码,问题仍然存在。
  • 如果他打算对异常做一些事情,我们只需要在 catch 块中设置一个变量——此时他没有......
【解决方案2】:

您可能希望将异常处理放在 using 块中,如下所示:

using (SqlConnection sourceCnx = new SqlConnection(SOURCE_CONN_STRING))
    {
        try
        {
            sourceCnx.Open();
            SqlCommand sysCmd = sourceCnx.CreateCommand();
            sysCmd.CommandText = "My query";
            sysCmd.ExecuteNonQuery();
        }
        catch (SqlException e)
        {
            // This will catch any SQL Exceptions.
            // Use "throw;" if you want to rethrow the exception up the stack
        }
        catch (Exception e)
        {
            // This will catch any other exceptions.
            // Use "throw;" if you want to rethrow the exception up the stack
        }
    } 

假设您实际上已将“我的查询”替换为特定于您的方案的内容,则 SqlException 很可能是由于您的计算机无法看到 SQL Server 实例。尝试 ping 它...

【讨论】:

  • 能否请您准确告诉我们您对 CommandText 使用的是什么,并在您的问题中粘贴异常的详细信息?
  • 我们也可以有 SOURCE_CONN_STRING 吗?忘记 commandText - 这不是你的问题......
【解决方案3】:

试试这个:

try
{
    using (SqlConnection sourceCnx = new SqlConnection(SOURCE_CONN_STRING))
    {
        sourceCnx.Open();
        SqlCommand sysCmd = sourceCnx.CreateCommand();
        sysCmd.CommandText = "My query";
        sysCmd.ExecuteNonQuery();
    }
}
catch(SqlException sqlEx)
{
    MessageBox.Show("there was a sql issue");
}
catch(Exception ex)
{
    MessageBox.Show("there was some other issue");
}

【讨论】:

    【解决方案4】:

    您已将环境设置为在引发 CLR 异常时始终中断。如果您愿意,您可以保留它,然后按 F5 继续执行您的程序。或者你可以关闭它(默认关闭):

    转到Debug 菜单,选择Exceptions 并确保Common Language Runtime Exceptions没有被选中。

    【讨论】:

    • 已检查但我取消了它。现在它成功显示了消息,但在那之后,Visual Studio 要我按“继续”让我的程序继续。但即使这样做,我的程序也会变得异常缓慢。
    • 在哪一行继续?
    • 在 catch 块之后的“}
    【解决方案5】:

    我认为你应该得到 BaseException

    catch (Exception exp)
        {
            if (exp.GetBaseException() is System.Data.SqlClient.SqlException)
            {
                var sqlException = exp.GetBaseException() as System.Data.SqlClient.SqlException;
    
                if (sqlException != null && sqlException.Number == 547)
                {
                    //do something
                }
            }
            //do something
        }
    

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多