【发布时间】:2016-05-19 13:33:36
【问题描述】:
我有来自 A 类的以下 sn-p,我在其中对数据库执行异步操作并订阅 InfoMessage 事件处理程序以捕获来自 SQL 的信息性消息。
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);
}
}
}
在 B 类中,我使用了一个后台工作程序,它使用 A 类的实例在 try catch 中运行“BackupDatabase”
try
{
DBOperations.BackupDatabase("DB","C:\\DBBackup\\DB.bak");
}
catch (Exception ex)
{
logFile.ExMsg(ex.Message);
logFile.ExMsg(ex.StackTrace);
/* additional code to stop bgWorker */
}
根据从 SQL 报告的消息的严重性级别,我将相应地处理它,每当从那里抛出异常时,BackgroundWorker 都没有捕获从 ClassA.BackupInfoMessages 抛出的异常......我已经尝试过移动我的try/catch 块并在 BackupDatabase 方法中添加一个没有运气。它似乎只是跳过它并将其视为没有抛出异常。 VS 中的调试器显示抛出了 System.Exception,但没有任何影响。我错过了什么或做错了什么?谢谢!
【问题讨论】:
-
我转而使用 ExecuteNonQuery()。感谢您的帮助!
-
我删除了我的答案,因为调用代码确实应该捕获到异常。你在 VS 中看到它,但它没有被调用方法捕获,这很奇怪......必须考虑一下:-|
-
您可能会尝试的一件事是不在后台工作人员中捕获异常,而是在工作人员的 RunWorkerCompleted 事件中处理它。由于有多个线程在运行,这可能是捕获它的更合适的方法。
-
我将如何在
RunWorkerCompleted事件中处理它?删除 try/catch 块什么都不做,并且仍然像正常运行一样返回,尽管调试器显示抛出异常。
标签: c# .net exception-handling