2017-08-16 24 views
0

如果MySQL連接的CertificatePasswordCertificateFile不正確,它會崩潰我的應用程序。這是一個問題,原因是用戶是輸入連接信息的用戶。這意味着如果他們錯誤地輸入CertificatePasswordCertificateFile,應用程序崩潰而不是告訴他們錯誤消息。我想在代碼周圍放一個try就行了,但沒有。C#MySqlConnection崩潰應用程序不正確證書信息

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.CryptographicException」未處理的異常發生在 MySql.Data.dll其他信息:系統找不到指定的文件 。

請注意:如果CertificatePasswordCertificateFile是正確的,此代碼完美工作。此外,如果用戶輸入了除CertificatePasswordCertificateFile以外的任何錯誤,則應用程序會向用戶返回錯誤消息。

我只是想讓用戶有機會修復他們的錯誤,而不必重新啓動應用程序。

回答

1

的問題是,你的代碼只捕獲異常,如果它是MySqlException類型。其他任何東西都會傳回給調用堆棧,或者正如您發現的那樣,會導致您的應用程序終止。你可以嘗試捕捉特定的異常,在這種情況下,通過增加另一個catch塊是一個CryptographicException

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 
} 
1

你可以使用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) 
{ 
}