如何在 C# 中调试异常?

How to debug exceptions in C#?

在我的 Windows Forms 应用程序中,我在第 56 行(在 catch 内)不断收到未处理的 ArgumentException ("input array is longer than number of columns in table")。出于调试目的,我试图显示一个消息框,但我总是遇到异常,并且消息框从不显示。

  1. 为什么消息框不显示?
  2. 如何获取 row.Length、errMsg 等的当前值并将它们打印到我可以阅读的地方?

手表 window 显示 "value not available at current pointer"。

如何在 Windows 表单应用程序中打印简单的调试信息,就像在控制台应用程序中一样?

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();
    }

}
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 关键字用于重新抛出异常。看到这个:What does "throw;" by itself do?

原来问题出在 else 子句中:我试图向空的 dataTable 添加一个新行,而没有事先创建列。

我在下面添加了 for 循环,现在代码运行正常。

else {

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

  dataTable.Rows.Add(row);
}

让我很困惑的是 Visual Studio 实际上将异常符号放在 catch- 块的末尾,尽管 else if-甚至没有输入块,异常实际上是在 else-block.

中抛出的

感谢 Chetan 和 PaulF 指导我使用断点进行调试!!