C#MySqlConnection应用程序因证书信息不正确而崩溃

C#MySqlConnection应用程序因证书信息不正确而崩溃,c#,mysql,C#,Mysql,如果MySQL连接的CertificatePassword或CertificateFile不正确,则会使我的应用程序崩溃。这是一个问题的原因是用户是输入连接信息的用户。这意味着,如果他们错误地键入CertificatePassword或CertificateFile,应用程序将崩溃,而不是告诉他们错误消息。我认为在代码周围放置一个try会起作用,但事实并非如此 try { MySqlConnection con = new MySqlConnection(conString);

如果MySQL连接的
CertificatePassword
CertificateFile
不正确,则会使我的应用程序崩溃。这是一个问题的原因是用户是输入连接信息的用户。这意味着,如果他们错误地键入
CertificatePassword
CertificateFile
,应用程序将崩溃,而不是告诉他们错误消息。我认为在代码周围放置一个
try
会起作用,但事实并非如此

try
{
        MySqlConnection con = new MySqlConnection(conString);
        MySqlDataAdapter da = new MySqlDataAdapter();
        MySqlCommand cmd = new MySqlCommand(sqlCMD, con);
        RSACryptoServiceProvider.UseMachineKeyStore = true;
        var provider = new RSACryptoServiceProvider();
        con.Open();
        da.SelectCommand = cmd;
        da.Fill(dt);
        cmd.Dispose();
        con.Close();
}
catch (MySqlException x)
{
        //Error logic
}
应用程序在
con.Open()上崩溃带有错误

类型的未处理异常

中发生“System.Security.Cryptography.CryptographyException” MySql.Data.dll其他信息:系统找不到该文件 指定的

请注意:如果
CertificatePassword
CertificateFile
正确,则此代码工作正常。此外,如果用户输入了除
CertificatePassword
CertificateFile
以外的任何错误,则应用程序将向用户返回错误消息


我只想让用户有机会修复错误,而不必重新启动应用程序。

您可以使用
using
来处理连接,并添加
catch
异常

try
{
    using MySqlConnection con = new MySqlConnection(conString)
    {
    MySqlDataAdapter da = new MySqlDataAdapter();
    using MySqlCommand cmd = new MySqlCommand(sqlCMD, con)
    {
    RSACryptoServiceProvider.UseMachineKeyStore = true;
    var provider = new RSACryptoServiceProvider();
    con.Open();
    da.SelectCommand = cmd;
    da.Fill(dt);
    }
}
}
catch (MySqlException x)
{
    //Error logic
}
catch (Exception ex)
{
}

您可以使用
using
处理连接并添加
catch
异常

try
{
    using MySqlConnection con = new MySqlConnection(conString)
    {
    MySqlDataAdapter da = new MySqlDataAdapter();
    using MySqlCommand cmd = new MySqlCommand(sqlCMD, con)
    {
    RSACryptoServiceProvider.UseMachineKeyStore = true;
    var provider = new RSACryptoServiceProvider();
    con.Open();
    da.SelectCommand = cmd;
    da.Fill(dt);
    }
}
}
catch (MySqlException x)
{
    //Error logic
}
catch (Exception ex)
{
}

问题是,您的代码只捕获类型为的异常。其他任何内容都将被传递回调用堆栈,或者正如您所发现的,将导致您的应用程序终止。您可以尝试捕获该特定异常,在本例中,通过添加另一个catch块来捕获该异常:

try
{
    //snip
}
catch (MySqlException x)
{
    //Error logic
}
catch(CryptographicException cex)
{
    //logic to handle crypto exception
}
或者,您可以更改异常处理程序以捕获所有内容:

try
{
    //snip
}
catch (Exception x)
{
    //Error logic for all exceptions
}

问题是,您的代码只捕获类型为的异常。其他任何内容都将被传递回调用堆栈,或者正如您所发现的,将导致您的应用程序终止。您可以尝试捕获该特定异常,在本例中,通过添加另一个catch块来捕获该异常:

try
{
    //snip
}
catch (MySqlException x)
{
    //Error logic
}
catch(CryptographicException cex)
{
    //logic to handle crypto exception
}
或者,您可以更改异常处理程序以捕获所有内容:

try
{
    //snip
}
catch (Exception x)
{
    //Error logic for all exceptions
}