SqlException 未在 Winforms 中捕获

SqlException not caught in Winforms

我得到了这个代码:

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)然后 return true 如果没问题,它将是相同的:由于没有互联网连接,我得到了一个例外。

有什么想法吗?

在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);
}

您可能希望将异常处理放在 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
        }
    } 

假设您实际上已将 "My Query" 替换为特定于您的方案的内容,则 SqlException 很可能是由于您的计算机无法看到 SQL 服务器实例。尝试 ping 一下...

试试这个:

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");
}

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

转到 Debug 菜单,select Exceptions 并确保 Common Language Runtime Exceptions 选中。

我认为你应该得到 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
    }