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

时间:2017-08-16 19:17:22

标签: c# mysql

如果MySQL连接的CertificatePasswordCertificateFile不正确,则会导致我的应用程序崩溃。这是一个问题的原因是用户是输入连接信息的用户。这意味着如果他们输入错误CertificatePasswordCertificateFile,应用程序崩溃而不是告诉他们错误消息。我认为在代码周围加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.CryptographicException'发生在   MySql.Data.dll附加信息:系统找不到该文件   指定。

请注意:如果CertificatePasswordCertificateFile正确,则此代码可以正常运行。此外,如果用户输入除CertificatePasswordCertificateFile以外的任何其他错误,则应用程序会向用户返回错误消息。

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

2 个答案:

答案 0 :(得分: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)
{
}

答案 1 :(得分:1)

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

var date: NSDate?

 override func viewDidLoad() {
        super.viewDidLoad()
        date = NSDate()
}

// ......
    @IBAction func save(_ sender: UIBarButtonItem) {
if let realDate = date {
            fullDate = "\(String(describing: realDate))"
        }
// ......
let wordItem = Word(word: word, translation: translation, date: fullDate, fullDate: trueDate, exOne: exOne, exTwo: exTwo, completed: false, keyRandom: randomString)
        let wordItemRef = self.ref?.child("Users").child(uid).child("LearnedWords").child(randomString)
        wordItemRef?.setValue(wordItem.toAnyObject())
        presentingViewController?.dismiss(animated: true, completion: nil)
}

或者您可以更改异常处理程序以捕获所有内容:

override func viewDidLoad() {
    super.viewDidLoad()

    // checking if user is in
    guard let uid = Auth.auth().currentUser?.uid else {
        return
    }

    // retrieving data from FireBase
    ref = Database.database().reference()
    databaseHandle = ref?.child("Users").child(uid).child("LearnedWords").observe(.value, with: { (snapshot) in
        var newItems: [Word] = []
        for item in snapshot.children {
            let wordItem = Word(snapshot: item as! DataSnapshot)
            newItems.append(wordItem)
        }
        newItems.sort(by: { $0.date.compare($1.date) == .orderedDescending})
        self.words = newItems
        self.getAllMessagesSent(snapshot: newItems)
    })
}
// retrieve data from Firebase to the View
    func getAllMessagesSent(snapshot: [Word]) {
        int = snapshot.count - 1
        array = snapshot
    }