0

我正在尝试将一个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));
                }
        });

我知道,我可以捕获异常并以这种正常方式将其显示在消息框中。

 try
    {
         this.SortedLaneConfigs[i].CheckConsistency();
    }
catch (Exception e)
    {
        MessageBox.Show("Error message below: \n\"" + String.Format("Configs #{0} NOT consistent : {1}", SortedLaneConfigs[i].Id, e.Message) + "\"", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

我用谷歌搜索了它,我找到了这 2 个链接,链接 1:http: //blogs.elangovanr.com/post/Catch-multiple-Exceptions-together-in-C.aspx链接 2 : 一次捕获多个异常?

我如何从这两个链接中调整建议的解决方案,以便在 RichTextBox 或其他东西或消息框中一次显示所有异常。请帮我。

4

2 回答 2

1

如果我错了,请纠正我,但我认为您想要处理可能发生的 15 种不同的异常,并RichTextBox在一次拍摄中显示它们。您可以使用try...catch捕获它们中的每一个,收集到一个列表中,然后创建一个AggregateException。将其传递给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);
}
于 2012-11-01T15:03:49.827 回答
1

您可以连接 Exception.Message 字符串并将它们显示在您喜欢的任何位置:首先创建 StringBuilder 实例,然后再输入您的方法:

StringBuilder exBuilder = new 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();

richTextBox1.Text = exBuilder.ToString();

编辑: 假设你有一个表格,上面有RichTextboxButton。如果Button启动您的方法,那么用例可以是这样的:

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);
            }
        }
}
于 2012-11-01T15:06:11.197 回答