BackgroundWorker не передает исключение FileNotFoundException в RunWorkerCompleted - PullRequest
1 голос
/ 27 апреля 2020

Я работаю над проектом WinForms, и в какой-то момент мне нужно загрузить XmlDocument в фоновом режиме. У меня есть BackgroundWorker, чтобы сделать это, но когда XmlDocument не может быть найден, BackgroundWorker генерирует исключение System.IO.FileNotFoundException в DoWork вместо передачи его в RunWorkerCompleted.

private void LoadBgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //---download manifest---
            SetStatusText("Downloading manifest...");
            Manifest = new System.Xml.XmlDocument();
            Manifest.Load(Properties.Resources.ManifestUrl); // <-- this is where the code gets stuck, it alerts me that the exception is unhandled
        }

private void LoadBgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Success = false;
                Error = e.Error;
                this.Close();
            }
            else
            {
                //---loading complete, close form---
                Success = true;
                this.Close();
            }
        }

Я что-то здесь упустил? Не должно ли исключение автоматически вызывать RunWorkerCompleted, чтобы его можно было обработать там?

1 Ответ

1 голос
/ 27 апреля 2020

Проверяли ли вы, чтобы в настройках исключений была отмечена галочка System.IO.FileNotFoundException «Break at the throw»?

Возможно, так как фоновый работник DoWork перехватывает исключение в случае выброса.

От Microsoft ( полная статья здесь ):

Скажите отладчику прерваться при возникновении исключения

Отладчик может прервать выполнение в точке, где выдается исключение, поэтому вы можете проверить исключение перед вызовом обработчика.

В окне «Параметры исключений» («Отладка»> «Windows> Параметры исключений») разверните узел для категории исключений, например Распространенные языковые исключения. Затем установите флажок для указанного исключения c в этой категории, например System.AccessViolationException. Вы также можете выбрать целую категорию исключений.

...