Обработка исключений с помощью BackgroundWorker - PullRequest
0 голосов
/ 14 февраля 2020

В приложении WinForms в методе, запускаемом при возникновении события BackgroundWorker.DoWork, возникает исключение.

System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
worker.DoWork += import_begin;
System.Objects arguments = new System.Object[] {filename, why};
worker.RunWorkerAsync(arguments);

private void import_begin(System.Object sender, System.ComponentModel.DoWorkEventArgs args)
{
    // unpack the arguments
    System.String filename = (System.String)arguments[0];

    // exception is occurring here
    Controller.Excel excel = new Controller.Excel(filename);
}

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

«Исключение было сгенерировано целью вызова». enter image description here

Возможно ли предотвратить это диалоговое окно?

Кстати, исключение имеет тип InvalidDataException из-за недопустимого тип файла, который пытался импортировать.

Редактировать: частичный Controller.Excel код:

class Excel
{
    protected OfficeOpenXml.ExcelPackage excel;
        protected const int HEADER_ROW_OFFSET = 7;
        System.Globalization.CultureInfo provider;

        // ctor
        public Excel(System.String filename)
        {

            excel = new OfficeOpenXml.ExcelPackage(new System.IO.FileInfo(filename));
            excel.Compatibility.IsWorksheets1Based = false;
            provider = System.Globalization.CultureInfo.InvariantCulture;

        }
}

1 Ответ

0 голосов
/ 14 февраля 2020

OP:

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

Звучит так, как будто вы просто хотите обработать условие изящно, когда пользователь каким-то образом выбирает файл, который не является файлом Excel и / или поврежден.

Измените ваш код на что-то вроде:

private void import_begin(System.Object sender, System.ComponentModel.DoWorkEventArgs args)
{
    // unpack the arguments
    System.String filename = (System.String)arguments[0];

    // you probably should inspect the file extension in `filename` to see if it
    // is at least .xls or .xlsx prior to using Controller

    try
    {   
        Controller.Excel excel = new Controller.Excel(filename);
        ...        
    }
    catch (InvalidDataException ex)
    {
        // gracefully handle the error
        ...
    }
    catch (Exception ex)
    {
        // eat, don't want thread to unwind
    }
}

Теперь, если они выбирают любой другой тип файла или файл поврежден в Excel, выше будет вызван обработчик catch, где вы можете корректно обработать ситуацию.

Обычно вам не нужно обновлять пользовательский интерфейс у работника, но MessageBox имеет это собственный насос сообщений.

Совет

Чтобы сохранить его аккуратным, вы можете проверить расширение файла перед запуском BackgroundWorker. Это быстрая проверка на быстрый выигрыш, и все действия, связанные с пользовательским интерфейсом, хранятся в главном потоке, а не в дочернем потоке, где все становится более сложным.

...