Как отладить исключения в C #? - PullRequest
0 голосов
/ 30 апреля 2018

в моем приложении Windows Forms я получаю необработанное исключение ArgumentException («входной массив длиннее, чем количество столбцов в таблице») в строке 56 (в пределах catch). В целях отладки я пытаюсь показать окно сообщения, но всегда получаю исключение, а окно сообщения никогда не отображается.

  1. Почему окно сообщения не отображается?
  2. Как я могу получить текущие значения row.Length, errMsg и т. Д. И распечатать их где-нибудь, где я могу их прочитать?

В окне просмотра указано «значение недоступно для текущего указателя».

Как я могу печатать простую информацию отладки в приложениях Windows Forms, так же, как я делал бы в консольных приложениях?

P.S. Приведенный ниже метод запускается после нажатия кнопки в приложении форм.

using System;
using System.Data;
using System.IO;
using System.Text;
using CsvHelper;
using System.Windows.Forms;

namespace ARautomat_visual {

    class Model {

        // read CSV-file to DataTable
        // hasHeader is passed as FALSE
        public static DataTable GetDataTableFromCsv (string file, bool hasHeader = true) {

            DataTable dataTable = new DataTable();

            using (TextReader infile = new StreamReader(file, Encoding.Default))
            using (CsvParser csv = new CsvParser(infile)) {
                csv.Configuration.Delimiter = ";";

                bool datevFormat = false;
                string[] row;

                for (int i = 0; (row = csv.Read()) != null; i++) {

                    if (i == 0) {

                        if (datevFormat == false && (row[0] == "EXTF" || row[0] == "DTVF")) {
                            datevFormat = true;
                            i--;
                        }
                        else if (hasHeader == true) {
                            try {
                                string errMsg = $"row.Length: {row.Length}\n";

                                foreach (DataColumn item in dataTable.Columns) {
                                    errMsg += $"{item.ColumnName}, ";
                                }

                                Program.TriggerError(errMsg);

                                for (int j = 0; j < row.Length; j++) {
                                    dataTable.Columns.Add(row[j]);
                                }
                            }
                            catch (Exception e) {
                                string errMsg = $"Fehler: {e.Message}; row.Length:     {row.Length.ToString()}; Columns:     {dataTable.Columns.ToString()}";    

                                MessageBox.Show("Mist!");
                                Program.TriggerError(errMsg);
                                throw; // this is line 56
                            }
                        }
                        else {
                            dataTable.Rows.Add(row);
                        }
                    }
                    else if (i > 0) {
                        dataTable.Rows.Add(row);
                    }
                }
            }

            return dataTable;                
        }
    }
}

Program.cs

static class Program {

    // print all warnings
    public static void PrintWarnings() {
      if (!String.IsNullOrEmpty(warningsTriggered)) {
        TriggerStatus(warningsTriggered, "Warnung");
      }
    }

    // print warnings, print errors, exit
    public static void TriggerError (string msg) {
      PrintWarnings();
      TriggerStatus("Fehler: " + msg + @"Programm wird nach Klick auf 'OK' beendet.", "Fehler");
      //Application.Exit();
      Form.ActiveForm.Close();
    }

}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

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

Я добавил for -loop ниже, и теперь код работает нормально.

else {

  for (int j = 1; j <= row.Length; j++) {
    dataTable.Columns.Add("Column " + j);
  }

  dataTable.Rows.Add(row);
}

Что меня сильно смутило, так это то, что Visual Studio фактически помещал символ исключения в конце catch -блока, несмотря на то, что в else if -блок даже не было введено и исключение был фактически брошен в else -блок.

Спасибо Chetan и PaulF за руководство по отладке с использованием точек останова !!

0 голосов
/ 30 апреля 2018
catch (Exception e)
{
    string errMsg = $"Fehler: {e.Message}; row.Length: {row.Length.ToString()}; Columns: {dataTable.Columns.ToString()}";    

    MessageBox.Show("Mist!");
    Program.TriggerError(errMsg);
    throw; // this is line 56
}

Ваша проблема в том, что вы используете ключевое слово throw. Ключевое слово throw используется для повторного выброса исключения. Смотрите это: Что значит «бросить»; само собой делать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...