C# 捕获RichTextBox中的所有异常

C# 捕获RichTextBox中的所有异常,c#,winforms,exception,richtextbox,messagebox,C#,Winforms,Exception,Richtextbox,Messagebox,我正在尝试将一个xml文件加载到接口中,可能会有许多基于xml文件中数据的异常,因此我希望一次捕获所有异常。 我得到了大约15个异常,并将其显示一次RichTextBox或其他内容,或显示在MessageBox中 for (int i = 0; i < this.SortedLaneConfigs.Count; i++) { if(this.SortedLaneConfigs[i].CheckConsistency()) {

我正在尝试将一个xml文件加载到接口中,可能会有许多基于xml文件中数据的异常,因此我希望一次捕获所有异常。 我得到了大约15个异常,并将其显示一次
RichTextBox
或其他内容,或显示在
MessageBox

for (int i = 0; i < this.SortedLaneConfigs.Count; i++)
    {
         if(this.SortedLaneConfigs[i].CheckConsistency())
            {
                throw new DataConsistencyException(String.Format("Lane #{0} NOT consistent : {1}", i, e.Message)
            }
    }


if (this.SortedLaneConfigs[i - 1].EndB > this.SortedConfigs[i].BeginB)
    {
        throw new DataConsistencyException(String.Format("Lanes {0} & {1}  overlap", i - 1, i));
    }

    this.SortedLaneConfigs.ForEach(
        laneConfig =>
        {
            if (this.SortedLaneConfigs.FindAll(item => item.Id == laneConfig.Id).Count != 1)
                {
                    new DataConsistencyException(String.Format("Id \"{0}\" present more than once", laneConfig.Id));
                }
        });
我在谷歌上搜索了一下,发现了这两个链接,link1:link2:


我如何调整这两个链接中建议的解决方案,以便在RichTextBox或其他内容或messageBox中同时显示所有异常。请帮助我。

如果我错了,请纠正我,但我认为您需要处理可能发生的15种不同的异常,并在
RichTextBox
中一次性显示它们。您可以使用
try…catch
捕获它们中的每一个,收集到列表中,然后创建一个。将其传递到
RichTextBox
并显示所有包含的错误。下面是一个代码示例:

private void Form1_Load(System.Object sender, System.EventArgs e)
{
    Dictionary<int, int> dict = GetDictionaryWithData();
    try {
        DoProcessing(dict);
    } catch (AggregateException ex) {
        RichTextBox1.Text = ex.ToString;
    }
}

private Dictionary<int, int> GetDictionaryWithData()
{
    Dictionary<int, int> dict = new Dictionary<int, int>();
    {
        dict.Add(5, 5);
        dict.Add(4, 0);
        dict.Add(3, 0);
        dict.Add(2, 2);
        dict.Add(1, 0);
    }
    return dict;
}

private void DoProcessing(Dictionary<int, int> dict)
{
    List<Exception> exceptions = new List<Exception>();
    for (int i = 0; i <= dict.Count - 1; i++) {
        int key = dict.Keys(i);
        int value = dict.Values(i);
        try {
            int result = key / value;
        } catch (Exception ex) {
            exceptions.Add(ex);
        }
    }
    if (exceptions.Count > 0)
        throw new AggregateException(exceptions);
}
private void Form1\u加载(System.Object sender,System.EventArgs e)
{
Dictionary dict=GetDictionaryWithData();
试一试{
数据处理(dict);
}捕获(聚合异常){
RichTextBox1.Text=ex.ToString;
}
}
私有字典GetDictionaryWithData()
{
Dictionary dict=新字典();
{
添加(5,5);
dict.Add(4,0);
dict.Add(3,0);
添加(2,2);
dict.Add(1,0);
}
返回命令;
}
私有void数据处理(字典dict)
{
列表异常=新列表();
对于(int i=0;i 0)
抛出新的AggregateException(异常);
}

您可以连接异常消息字符串,并将其显示在任意位置: 在输入方法之前,首先创建StringBuilder实例:

然后执行方法并附加异常消息:

try
{
         this.SortedLaneConfigs[i].CheckConsistency();
}
catch (Exception e)
{
        exBuilder.Append("Error message below: \n\"" + String.Format("Configs #{0} NOT consistent : {1}", SortedLaneConfigs[i].Id, e.Message) + "\"");
        exBuilder.Append(Environment.NewLine);
}
完成后,可以使用
exBuilder.ToString()获取字符串

编辑: 假设您有一个表单,上面有
RichTextbox
按钮。如果
按钮启动您的方法,那么用例可以如下所示:

public partial class Form1 : Form
{
        StringBuilder exBuilder;
        public Form2()
        {
            InitializeComponent();
            exBuilder = new StringBuilder();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            exBuilder.Clear();
            MyMethod();
            //and all your other methods that have exBuilder.Append in their try-catch blocks
            richTextBox1.Text = exBuilder.ToString();
        }

        void MyMethod()
        {
            try
            {
                //you code or whatever
            }
            catch(Exception e)
            {
                exBuilder.Append("Error message below: \n\"" + String.Format("Configs #{0} NOT consistent : {1}", parameter, e.Message) + "\"" + Environment.NewLine);
            }
        }
}

使用RichTextBox.AppendText()方法。@Hans Passant:您能给我一个片段,告诉我如何使用RichTextBox.AppendText()一次获取所有异常吗。谢谢。你的要求毫无意义。异常不会一次全部引发。你一次抓一个。将MessageBox.Show替换为AppendText()。对此,最好使用异常以外的内容。如果预期文件中会出现这些问题,那么异常使用起来就会像转到这里一样笨拙。@Dan:当然,你是对的,但是这个文件已经创建了,我无法更改它。这就是为什么我尝试使用RTB根据下面给出的解决方案来附加所有EXEP消息。如果我没有弄错的话,我必须在所有try catch中使用
exBuilder.append
,并像这样调用它
richTextBox1.Text=exBuilder.ToString()否,每当捕获异常时都需要追加消息文本,代码完成后,只需在richTextBox1.text中从生成器中设置文本。这样,当您完成时,所有异常都将立即出现。另一个解决方案是@HansPassant建议的,每当出现异常消息文本时,将其附加到RichTextBox中,并且在您的try-catch块中捕获它们之后,它们将立即可见。Nick:我在类和表单中使用您的代码,我这样称呼它,
RichTextBox RichTextBox 1=new RichTextBox();richTextBox1.Text=exBuilder.ToString()我如何引用èxBuilder`?@linguini您看到编辑了吗?我想你应该更清楚该怎么做。@linguini:噢,对不起。转换为C#。我只需对我的calss文件中的所有异常使用try catch,只需使用表单中的代码在Richtextbox中显示异常,对吗???@linguini:通常是的。但不要忘记收集捕获的所有异常,并在完成时抛出聚合异常。这种方法还允许您将UI与业务层分离,因为DoProcessing不引用任何控件。我认为,在代码<字符串> /CODE>中收集异常是一个错误的做法,因为如果您决定以不同的方式处理异常,则将添加维护工作,例如,将它们记录到数据库等。
try
{
         this.SortedLaneConfigs[i].CheckConsistency();
}
catch (Exception e)
{
        exBuilder.Append("Error message below: \n\"" + String.Format("Configs #{0} NOT consistent : {1}", SortedLaneConfigs[i].Id, e.Message) + "\"");
        exBuilder.Append(Environment.NewLine);
}
richTextBox1.Text = exBuilder.ToString();
public partial class Form1 : Form
{
        StringBuilder exBuilder;
        public Form2()
        {
            InitializeComponent();
            exBuilder = new StringBuilder();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            exBuilder.Clear();
            MyMethod();
            //and all your other methods that have exBuilder.Append in their try-catch blocks
            richTextBox1.Text = exBuilder.ToString();
        }

        void MyMethod()
        {
            try
            {
                //you code or whatever
            }
            catch(Exception e)
            {
                exBuilder.Append("Error message below: \n\"" + String.Format("Configs #{0} NOT consistent : {1}", parameter, e.Message) + "\"" + Environment.NewLine);
            }
        }
}