如果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.CryptographicException'发生在 MySql.Data.dll附加信息:系统找不到该文件 指定。
请注意:如果CertificatePassword
或CertificateFile
正确,则此代码可以正常运行。此外,如果用户输入除CertificatePassword
或CertificateFile
以外的任何其他错误,则应用程序会向用户返回错误消息。
我只想让用户有机会修复错误,而不必重新启动应用程序。
答案 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
}