0

BackgroundWorkerが未処理の例外を食べてプロパティに渡すことを知っています。RunWorkerCompleted e.Error例外を処理する正しい方法は、チェックすることe.Error != nullです。

DoWorkイベントのメソッドにはいくつかのtry catchブロックがありますが、機能しているのはそのうちのいくつかだけFailedOperationExceptionです。コードが unaviable な dll のクラスにアクセスしようとすると、FileNotFoundExceptionneighterFileNotFoundExceptionまたはExceptioncatch ブロックによってキャッチされないクラスがスローされます。その代わりに、 のe.Errorプロパティに移動しますRunWorkerCompleted

一部の例外のみがキャッチされるのはなぜですか?

コード:

    try
    {
        SqlConnection connection = new SqlConnection(Properties.Settings.Default.CharityConnectionString);
        String dataSource = connection.DataSource;

        if (((ActionType)e.Argument) == ActionType.Backup)
        {
            try
            {
                lblWait.Text = "Starting backup operation ...";
                ServerConnection serverConnection = new ServerConnection(dataSource);
                Server sqlServer = new Server(serverConnection); // The exception is thrown here
                String originalBackupPath = fileName;
                BackupDeviceItem backupDevice = new BackupDeviceItem(originalBackupPath, DeviceType.File);
                Backup backup = new Backup();
                backup.Action = BackupActionType.Database;
                backup.Database = "Charity";
                backup.Devices.Add(backupDevice);
                backup.Initialize = true;
                backup.Checksum = true;
                backup.ContinueAfterError = true;
                backup.Incremental = false;
                backup.LogTruncation = BackupTruncateLogType.Truncate;
                backup.SqlBackup(sqlServer);
                MessageBox.Show("Backup was successfull", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (FileNotFoundException ex) // this catch doesn't work for FileNotFoundException exceptions
            {
                MessageBox.Show("Error in operation" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (FailedOperationException)
            {
                MessageBox.Show("Access to the selected folder is denied", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception) // and this catch doesn't work for FileNotFoundException, too
            {
                MessageBox.Show("Error in operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
    catch(Exception)
    {
        MessageBox.Show("Error in operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

「ファイルまたはアセンブリを読み込めませんでした。Microsoft.SqlServer.ConnectionInfo 」というFileNotFoundExceptionメッセージが表示されるのは、. アセンブリのプライベート インストールによってこの例外を解決する方法を知っています。e.Error

4

1 に答える 1

0

私の推測では、例外が間違っていると思います。あなたはで見ていますInnerExceptione.Error

このコードは期待どおりに機能します。

using System;
using System.ComponentModel;
using System.IO;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += (s, e) =>
        {
            try
            {
                throw new FileNotFoundException();
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("FileNotFoundException caught");
            }
        };

        worker.RunWorkerCompleted += (s, e) =>
        {
            if (e.Error != null)
                Console.WriteLine("RunWorkerCompleted error is {0}", e);
        };

        worker.RunWorkerAsync();
        while (worker.IsBusy)
            Thread.Sleep(1);
    }
}
于 2012-10-31T16:55:26.397 に答える