データベースに対して非同期アクションを実行しているInfoMessageイベントハンドラに登録して、SQLから情報メッセージを取得するクラスAの次のスニペットがあります。クラスBでは 別のクラスのイベントハンドラからの例外のキャッチ
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);
}
}
}
、私は、メッセージの重大度に応じて、トライキャッチ
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から報告された「BackupDatabaseなどを」実行するために、クラスAのインスタンスを使用するのBackgroundWorkerを使用しています、私はそれに応じて、例外がそこからスローされるたびに、BackgroundWorker ClassA.BackupInfoMessagesからスローされた例外をキャッチしていません...私はtry/catchブロックの周りを移動し、BackupDatabaseメソッドで幸運と1つを追加しようとしました。それはちょうどそれをスキップし、例外がスローされていないかのように扱うようです。 VSのデバッガは、System.Exceptionがスローされたが、何も影響を受けていないことを示しています。何かを逃したり、何か間違っているのですか?ありがとう!
私はExecuteNonQuery()に切り替えました。助けてくれてありがとう! – ephtee
私は自分の答えを削除しました。これは、呼び出し元のコードが本当に例外を捕らえたはずであることを見ています。それはあなたがVSでそれを見ているが、それは呼び出しメソッドで捕らえられていない奇妙です...それを直面する必要があります: - | – Clay
バックグラウンドワーカーで例外をキャッチしないで、ワーカのRunWorkerCompletedイベントで例外を処理することを試してみることもあります。演奏中に複数のスレッドがある場合、これをキャッチするより適切な方法かもしれません。 – Clay