处理来自GetFileAsync的Windows应用商店应用异常

时间:2014-04-01 20:11:32

标签: windows-8 c++-cli

我遇到以下代码示例的问题:

    Windows::Storage::StorageFolder^ location = Package::Current->InstalledLocation;

    try
    {
        task<StorageFile^> GetFileTask(location->GetFileAsync(sn));

        GetFileTask.then([=](StorageFile^ file)
        {
            try
            {
                task<IBuffer^> ReadFileTask(FileIO::ReadBufferAsync(file));

                ReadFileTask.then([=](IBuffer^ readBuffer)
                { 
                    // process file contents here      
                });
            }
            catch(Platform::Exception^ ex)
            {
                // Handle error here
            }

        });
    }
    catch(Platform::Exception^ ex)
    {
        // Handle error here
    }

当使用不存在的文件名时,该函数会抛出异常:

GameTest2.exe中0x0FFCC531(msvcr110d.dll)的未处理异常:将无效参数传递给认为无效参数致命的函数。

我一直在网上搜索,这个例外只有在连接到调试器时才会中断。我正在使用VS 2012.我已经关闭了所有相关的'异常中断',但它仍然导致调试器中断,我的处理程序没有机会处理异常。

如果文件丢失,我希望GetFileAsync方法抛出“文件不存在”异常。不确定为什么它会一直抛出“无效参数”异常。

这开始让我烦恼,我找不到任何已知的解决方案。有人有什么想法吗?

我将尝试将方法更改为不使用任务&lt;&gt;码。相反,我将使用'await'调用GetFileAsync。但是我相信'await'只会导致调用线程等到GetFileAsync完成,这种情况会导致异步加载失败。

我想知道这是否是使用任务时异常处理的常见问题。

更新

好的,我现在找到了解决方案:

    task<StorageFile^>( location->GetFileAsync(sn)).then([](StorageFile^ openedFile)
    {
        return FileIO::ReadBufferAsync(openedFile);
    }).then([](IBuffer^ readBuffer)
    {
        // Process file

    }).then([](task<void> t)
    {
        try
        {
            t.get();
        }
        catch(Platform::Exception^ e)
        {
            // Handle error
        }
    });

似乎需要在链的末尾添加一个额外的'then'条件来获取异常。

0 个答案:

没有答案