如何在C#中调试异常?

时间:2018-04-30 11:56:51

标签: c# exception-handling argumentexception

在我的Windows窗体应用程序中,我继续在第56行(catch中)获得未处理的ArgumentException(“输入数组比表中的列数长”)。出于调试目的,我试图显示一个消息框,但我总是得到异常,消息框永远不会显示。

  1. 为什么没有显示消息框?
  2. 如何获取row.Length,errMsg等的当前值并将其打印在我可以阅读的地方?
  3. 在观察窗口中,它显示“当前指针不可用的值”。

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

2 个答案:

答案 0 :(得分:1)

原来问题出在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 - 块不是&#39;甚至进入,else - 块实际上抛出了异常。

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

答案 1 :(得分:0)

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?