从另一个类的事件处理程序中捕获异常

时间:2016-05-19 13:33:36

标签: c# .net exception-handling

我有来自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但没有任何影响。我错过了什么或做错了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

您需要将BackupInfoMessages视为在其自己的单独后台工作程序中运行,这就是try / catch捕获它的原因,因为该事件与try / catch块不在同一个调用堆栈中。

除了直接引发异常以表明发生错误之外,您还需要一些其他方法。

我认为,但并非100%确定,任何错误级别11或更高级别的错误都会使ExecuteNonQuery抛出异常,其中包含错误信息,因此您可能不需要在事件处理程序中手动引发异常。但是,设置.FireInfoMessageEventOnUserErrors = true可能会改变该行为。

相关问题