Ich habe das folgende Codefragment aus Klasse A, wo ich eine Async-Aktion für eine Datenbank ausführen und den InfoMessage-Ereignishandler abonnieren, um Informationsnachrichten von SQL abzufangen.Abfangen von Ausnahmen von einem Ereignishandler aus einer anderen Klasse
public void BackupDatabase(string DatabaseName, string BackupLocation, bool backupType = true)
{
//SQL for FULL database backup
string SQL = "BACKUP DATABASE [" + DatabaseName + "] TO DISK = N'" + BackupLocation + "\\" + DatabaseName +".bak' WITH FORMAT, NAME = N'" + DatabaseName + "-Full Database Backup', STATS = 1";
using (SqlConnection db_conn = new SqlConnection(ConnectionString))
{
UpdateStatusText("Establishing Connection to Database");
db_conn.Open();
db_conn.FireInfoMessageEventOnUserErrors = true;
db_conn.InfoMessage += BackupInfoMessages;
using (SqlCommand sqlCmd = new SqlCommand(SQL, db_conn))
{
sqlCmd.ExecuteNonQuery();
}
UpdateStatusText("Backup Complete.");
}
}
private void BackupInfoMessages(object sender, SqlInfoMessageEventArgs e)
{
foreach (SqlError info in e.Errors)
{
if(info.Class > 10)
{
logFile.ExMsg("Exception : " + e.Message);
throw new Exception(e.Message);
}
else
{
UpdateStatusText(e.Message, 1);
}
}
}
In der Klasse B, ich bin mit einem Background, die eine Instanz der Klasse A verwendet „Backupdatabase“ in einem Try-Catch
try
{
DBOperations.BackupDatabase("DB","C:\\DBBackup\\DB.bak");
}
catch (Exception ex)
{
logFile.ExMsg(ex.Message);
logFile.ExMsg(ex.StackTrace);
/* additional code to stop bgWorker */
}
Je nach Schweregrad der Nachricht von SQL berichtet laufen , Ich werde es entsprechend behandeln, wenn eine Ausnahme von dort geworfen wird, fängt der BackgroundWorker nicht die Ausnahme ab, die von ClassA.BackupInfoMessages geworfen wird ... Ich habe versucht, meinen try/catch Block zu bewegen und einen in der BackupDatabase Methode ohne Glück hinzuzufügen . Es scheint, es einfach zu überspringen und es so zu behandeln, als ob keine Ausnahme geworfen wurde. Der Debugger in VS zeigt, dass eine System.Exception ausgelöst wurde, aber nichts betroffen ist. Fehle ich etwas oder mache ich etwas falsch? Vielen Dank!
Ich habe für die ExecuteNonQuery() ausgewechselt. Danke für die Hilfe! – ephtee
Ich löschte meine Antwort, weil ich sah, dass der aufrufende Code die Ausnahme wirklich hätte fangen sollen. Dass man es in VS sieht, aber nicht in der Calling-Methode gefangen wird, ist seltsam ... muss darüber nachdenken: - | – Clay
Eine Sache, die Sie versuchen könnten, ist, die Ausnahme nicht im Hintergrund-Worker abzufangen, sondern mit ihr im RunWorkerCompleted-Ereignis des Mitarbeiters umzugehen. Wenn mehrere Threads im Spiel sind, ist dies möglicherweise der geeignetere Weg, um es zu fangen. – Clay