WPF重新抛出处理异常

时间:2015-06-18 10:01:42

标签: c# wpf exception-handling

我还没有在Stackoverflow上找到解决方案。如果已经有,请告诉我。但首先尝试我的代码。我知道解决了非常相似但不相等的问题。

我有一个尝试在WPF中加载ResourceDictionary的方法。我想要做的是处理2种类型的异常并抛出我自己更有意义和特定的异常,因为我知道问题是什么。

现在我有一种非常奇怪的行为。当我调试代码。一切似乎都很好。但当我按f5继续Visual Studio告诉我,Exceptiontype XamlParseException未处理。但我处理了这个例外。应该处理的异常是ThemeNotFoundException。任何人都可以解释这里发生的事情。不幸的是,我不太了解WPF如何处理异常。

这是我的CodeSnippet:

private static ResourceDictionary LoadResourceDictionary(Uri newThemesUri)
{
    try
    {
        return new ResourceDictionary { Source = newThemesUri };
    }
    catch (XamlParseException xamlEx)
    {
        throw new ThemeNotFoundException(newThemesUri, xamlEx);
    }
    catch (IOException ioEx)
    {
        throw new ThemeNotFoundException(newThemesUri, ioEx);
    }
}

2 个答案:

答案 0 :(得分:2)

这是因为调用LoadResourceDictionary的代码由WPF代码包装,后者为某些可视元素(窗口,用户控件等)加载XAML。

因此,完整的异常流程如下所示:

    {li> XamlParseExceptionIOException LoadResourceDictionary(已处理) {li} ThemeNotFoundException LoadResourceDictionary(已处理) WPF代码中的
  • XamlParseException(未处理)。

实际上,WPF代码包含类似LoadResourceDictionary的内容:

catch (Exception ex)
{
    throw new XamlParseException("...", ex);
}

答案 1 :(得分:0)

看起来你所看到的XamlParseException稍后会在代码中抛出,可能是在某些视图或UserControl的某些InitializeComponent中...尝试在view / UserControl构造函数中设置断点并检查它是否在那里扔。如果是,您可以尝试将InitializeComponent调用包装在try / catch中。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        try
        {
            InitializeComponent();
        }
        catch (XamlParseException xamlEx)
        {
            throw new ThemeNotFoundException(newThemesUri, xamlEx);
        }
        catch (IOException ioEx)
        {
            throw new ThemeNotFoundException(newThemesUri, ioEx);
        }
    }
}