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