错误处理在任务遇到异常后,Continuation不会执行

时间:2013-01-03 05:00:40

标签: c++-cx

我是C ++ / CX任务的初学者,这让我疯狂。以下代码生成异常“将无效参数传递给认为无效参数致命的函数”。我知道它成功创建了文件并进入该任务的延续(或者至少命中了那里定义的断点),并且我99%肯定(基于之前的工作)由于文件不是这样的事实而发生异常有效的XML导致XmlDocument :: LoadFromFile方法爆炸。我想尝试实际捕获该异常,因此我构建了一个错误处理延续,如几个MSDN文档中所定义。 (第2个样本)

    TEST_METHOD(The_storage_file_must_reference_a_valid_xml_file)
    {
        auto folder = ApplicationData::Current->LocalFolder;

        auto createFileTask = 
            create_task(ApplicationData::Current->LocalFolder->CreateFileAsync("TestFile.txt", CreationCollisionOption::ReplaceExisting))
            .then([this] (StorageFile^ file)
            {
                XmlLoadSettings^ loadSettings = ref new XmlLoadSettings();
                loadSettings->ProhibitDtd = false;
                loadSettings->ResolveExternals = false;

                auto loadXmlDocumentTask = 
                    create_task(XmlDocument::LoadFromFileAsync(file, loadSettings))
                    .then([this] (XmlDocument^ doc)
                    {
                        int x = 99;
                    });
            });
    }

以下是错误延续的代码....

TEST_METHOD(The_storage_file_must_reference_a_valid_xml_file)
    {
        auto cut = ref new CategoryDataLoadBuilder();
        auto folder = ApplicationData::Current->LocalFolder;

        auto createFileTask = 
            create_task(ApplicationData::Current->LocalFolder->CreateFileAsync("TestFile.txt", CreationCollisionOption::ReplaceExisting))
            .then([this] (StorageFile^ file)
            {
                XmlLoadSettings^ loadSettings = ref new XmlLoadSettings();
                loadSettings->ProhibitDtd = false;
                loadSettings->ResolveExternals = false;

                auto loadXmlDocumentTask = 
                    create_task(XmlDocument::LoadFromFileAsync(file, loadSettings))
                    .then([this] (task<XmlDocument^> t)
                    {
                        try
                        {
                            t.get();
                        }
                        catch (COMException^ ex)
                        {
                            int x = 99;
                        }
                    });
            });
    }

当我尝试调试此测试时,我在测试引擎中遇到访问冲突,并且通常看起来好像调试器只是进入杂草。

我是否误解了错误延续的工作原理?它在VS测试引擎中不起作用吗?有没有更好的方法来检查XML文件坏的时候生成的“真实”异常,我可以明确检查我的测试?

提前致谢

1 个答案:

答案 0 :(得分:1)

经过一些额外的研究和理解,我发现了这篇博文:http://w8md.wordpress.com/2012/09/26/async-unit-tests-in-ccx/。在MSDN论坛How to use async function in unittest project by c++?中的链接之后,我看到MS Test框架不支持这一点。文章中提供的源代码工作正常。作为一个实验,我提取代码以泵送事件,并能够运行测试。 (当然,我建议使用/修改原作者的源代码。)

(顺便说一下,回答我自己的问题我感到非常不舒服,但我不知道还能做些什么。)