未捕获 MySQL 异常 (C#)

Posted

技术标签:

【中文标题】未捕获 MySQL 异常 (C#)【英文标题】:MySQL exceptions not caught (C#) 【发布时间】:2016-11-11 15:59:44 【问题描述】:

我的 C# 程序使用 mysql 数据库。

由于某些原因,程序无法捕获导致我的 MySQL 连接的异常。

例子:

如果我使连接字符串中的凭据无效,程序会像这样崩溃(即使在调试器中运行):http://imgur.com/SfzkVdW

连接代码是这样的:

using MySQLDriverCS;

namespace XXX

    public class Data
    
        private static MySQLConnection con;

        static Data()
        
            string connectionString = new MySQLConnectionString("XXX",
                "XXX",
                "XXX",
                "XXX").AsString;

            con = new MySQLConnection(connectionString + ";CharSet=utf8");
            con.Open(); // For testing the connection
            con.Close();
        
...

关于如何改进并开始捕获 MySQL 异常的任何想法?

我尝试将静态构造函数中的代码包装在 try-catch 中。那没有帮助。程序仍然以同样的方式崩溃。

谢谢。


与 try-catch 包装器相同的代码。它仍然失败并出现相同的错误:http://imgur.com/SfzkVdW

    static Data()
    
        try
        
            string connectionString = new MySQLConnectionString("XXX",
                "XXX",
                "XXX",
                "XXX").AsString;

            con = new MySQLConnection(connectionString + ";CharSet=utf8");
            con.Open(); // For testing the connection
            con.Close();
        
        catch(Exception ex)
        
            MessageBox.Show(ex.Message);
        
    

【问题讨论】:

尝试只将连接字符串传递给 mysqlconnection 对象,而不是使用 mysqlconnectionstring 对象 “未捕获异常”,因为没有 try-catch 块。尝试添加try-catch块,可以看到错误。 我尝试将静态构造函数中的代码包装在 try-catch 中。那没有帮助。程序仍然以同样的方式崩溃。 您收到此错误是因为它正在运行托管并且未为非托管代码配置调试器。转到项目的属性并检查 Debug 和 Build 选项卡。您应该能够在那里启用非托管代码调试。 【参考方案1】:

在 catch 块中使用适当的异常类型。

使用适当的 MySQL 类

using MySql.Data.MySqlClient;

// class level var or whatnot:
string connString = @"server=theHostName;userid=dbuser123;password=OpenSesame7;database=my_db_name";


public void connect()

    try
    
        conn = new MySqlConnection(connString); // read above comments for (conn)
        conn.Open();
    
    catch (MySqlException ex)
    
        MessageBoxButtons buttons = MessageBoxButtons.OK;
        string s="MySqlException: "+ex.ToString();
        MessageBox.Show(s,"Error",buttons);
    
    finally
    
        if (conn != null)
        
            //conn.Close();
        
    

错误没有发现问题:

添加引用截图:

【讨论】:

我尝试将静态构造函数中的代码包装在 try-catch 中。那没有帮助。程序仍然以同样的方式崩溃。 我会尝试搞砸我的连接字符串 发现我的错误没问题。上面以白色显示的错误陷阱屏幕 有时人们会忘记他们正在编译调试,而是运行旧版本代码。 idk 你在做什么或你的参考资料或课程。祝你好运:p 使用 MySql.Data.MySqlClient 代替 MySQLDriverCS 有很大帮助。现在我得到一个例外。非常感谢! - 猜猜现在是时候进行一些代码重构了。【参考方案2】:

在 C# 中捕获或处理异常通常需要 try-catch 语句。

语法基本如下:

try

    // operation likely to cause error
 
catch (Exception e)
    // handle error
    Console.WriteLine("Exception: " + e);


Console.Read();

因此,将您的 con.Open() 逻辑包装在 try-catch 语句中,如下所示:

try

    Con.Open();
 
catch (Exception e)
    // handle error
    Console.WriteLine("Possible MySQL Exception: " + e);

此外,您可以在try-catch 语句的末尾添加一个finally 块,无论是否处理了异常,它都会执行其代码:

    try

    // attempt to do something here
    con.Open();
 
catch (Exception e)
    // handle error
    Console.Writeline("Exception: " + e);

finally 

    Console.Writeline("This runs no matter if an exception is thrown or not!");


Console.Read();

【讨论】:

我尝试将静态构造函数中的代码包装在 try-catch 中。那没有帮助。程序仍然以同样的方式崩溃。

以上是关于未捕获 MySQL 异常 (C#)的主要内容,如果未能解决你的问题,请参考以下文章

C# 截获某个域中未捕获的异常

C# 程序异常管理方案

使 C# 中捕获的 Mysql 错误对用户友好

致命错误:未捕获的异常“PDOException”和消息“找不到驱动程序”

C# 捕获堆栈溢出异常

WPF捕获全局未处理异常