如何在 C# 中调试异常?
How to debug exceptions in C#?
在我的 Windows Forms 应用程序中,我在第 56 行(在 catch 内)不断收到未处理的 ArgumentException ("input array is longer than number of columns in table")。出于调试目的,我试图显示一个消息框,但我总是遇到异常,并且消息框从不显示。
- 为什么消息框不显示?
- 如何获取 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 指导我使用断点进行调试!!
在我的 Windows Forms 应用程序中,我在第 56 行(在 catch 内)不断收到未处理的 ArgumentException ("input array is longer than number of columns in table")。出于调试目的,我试图显示一个消息框,但我总是遇到异常,并且消息框从不显示。
- 为什么消息框不显示?
- 如何获取 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 指导我使用断点进行调试!!