无法一次捕获所有异常C#

时间:2012-11-06 14:50:44

标签: c# winforms exception xml-serialization richtextbox

我正在对xml文件进行去序列化,并且我正在尝试使用以下代码捕获所有异常艺术,但它只捕获一个异常。我在这里做的错误是什么?

代码:

StringBuilder exBuilder;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    var fileName = openFileDialog1.FileName;
    mruOpenRseConfig.AddRecentFile(fileName);
    try
    {
        ConfigDeserialized = MyConfig.DeserializeFromXmlFile(fileName);

    }

    catch (Exception ex)
    {
        if (ex is DataConsistencyException ||
            ex is XmlException)
        {
            exBuilder.Clear();
            exBuilder.Append(ex.Message + Environment.NewLine);

            RichTextBox richTextBox = new RichTextBox();

            richTextBox.Text = exBuilder;
            richTextBox.Dock = DockStyle.Fill;


            Form richMessageBox = new Form
            {
                StartPosition = FormStartPosition.CenterScreen,
                ControlBox = true,
                Text = "Error in File",
                MaximizeBox = false,
                MinimizeBox = false
            };

            richMessageBox.Controls.Add(richTextBox);

            richMessageBox.ShowDialog();
            return;
        }
        throw;
    }
}

1 个答案:

答案 0 :(得分:5)

代码只会抛出一个异常,因此您无法捕获多个异常。

例如:

try
{
    throw new NotSupportedException();
    throw new InvalidOperationException();
}
catch (Exception ex)
{
    //ex will always be NotSupportedException and never InvalidOperationException.
}

你不能让反序列化程序处理一个例外然后继续 - 除非它是你自己的 - 在这种情况下你必须在每个发生时捕获它们,记录它们然后再查看它们,或者引发事件每一个如果你想对它们作出反应就会发生。

异常用于打破程序流,因此当抛出一个程序时,它将停止正在执行的操作并中断所有其他执行,直到处理完毕。因此,一旦抛出第一个异常,反序列化器就会停止运行并中止。