我有来自A类的以下代码段,我在数据库上执行异步操作,并订阅InfoMessage事件处理程序以从SQL捕获信息性消息。
html:div
在B类中,我使用的是一个后台工作者,它使用A类实例在try catch中运行“BackupDatabase”
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);
}
}
}
根据从SQL报告的消息的严重性级别,我将相应地处理它,每当从那里抛出异常时,BackgroundWorker都没有捕获从ClassA.BackupInfoMessages抛出的异常...我试过移动我的try / catch块并在BackupDatabase方法中添加一个没有运气。它似乎只是跳过它并将其视为没有抛出Exception。 VS中的调试器显示抛出了System.Exception但没有任何影响。我错过了什么或做错了什么?谢谢!
答案 0 :(得分:1)
您需要将BackupInfoMessages
视为在其自己的单独后台工作程序中运行,这就是try / catch捕获它的原因,因为该事件与try / catch块不在同一个调用堆栈中。
除了直接引发异常以表明发生错误之外,您还需要一些其他方法。
我认为,但并非100%确定,任何错误级别11或更高级别的错误都会使ExecuteNonQuery抛出异常,其中包含错误信息,因此您可能不需要在事件处理程序中手动引发异常。但是,设置.FireInfoMessageEventOnUserErrors = true
可能会改变该行为。