wp8 I / O异常处理

时间:2013-01-23 14:46:13

标签: windows-phone-8 c++-cx

如何在Windows Phone 8,c ++ / cx?

上捕获I / O异常

编辑:这是一个完整的例子
检查文件“hello.txt”是否存在:

StorageFile^ Testme(String^ fileName)
{
    StorageFolder^ item =  ApplicationData::Current->LocalFolder; 
    try
    { 
        task<StorageFile^> getFileTask(item->GetFileAsync("hello.txt")); 
        getFileTask.then([](StorageFile^ storageFile)
        { 
           return storageFile;
         }); 
     }
     catch (Exception^ ex)
     {
        OutputDebugString(L"Caught the exception");
     }
     return nullptr;
}

如果“hello.txt”exsit,方法Testme会像魅力一样返回文件ptr 如果“hello.txt不存在,它不仅不会抛出异常FileNOtFound,而是在调试器窗口中出现这种情况而崩溃:

MyPhoneApp.exe中0x71D49C01(Msvcr110d.dll)的未处理异常:将无效参数传递给认为无效参数致命的函数。 如果存在此异常的处理程序,则可以安全地继续该程序

出了什么问题,如何优雅地检查WP8中是否存在文件?

我真的希望有人回答......谢谢。

1 个答案:

答案 0 :(得分:2)

花了好几个小时来弄清楚相关问题中的问题后,我终于明白了。使用C ++,它看起来Visual Studio的行为有点有趣。它不是将异常传递给用户,而是抛出它。这意味着即使你有一个异常处理程序,你的处理程序也不允许处理它。我应该在此注意,只有在Visual Studio中运行应用程序时才会发生这种情况。部署和启动应用程序没有问题。

要解决此问题,请打开例外设置(从菜单&gt;调试&gt;例外 - 或Ctrl + D,E)。放大“C ++ Exceptions”并在“Thrown”列中取消选择“Platform :: InvalidArgumentException”。然后你应该好好去。

首次评论后更新:

首先,我必须从列表中取消选择COMException,以便下面的示例能够正常工作。

除了上面做的。了解C ++ / CX中的异步编程非常重要。创建任务后,您无法简单地从函数返回。如果您确实需要返回,则需要返回您创建的工作任务以完成工作。下面是Windows应用商店应用示例(不是WP),但它们的工作原理相同。您的帮助函数必须如下所示。

concurrency::task<bool> TestFileExists::MainPage::Testme(String^ fileName)
{
    using namespace Windows::Storage;
    using namespace concurrency;

    StorageFolder^ item =  ApplicationData::Current->LocalFolder; 

    return create_task(item->GetFileAsync(fileName)).then([this](task<StorageFile^> t)
    {
            bool fileExists = true;

            try {
                    StorageFile^ file = t.get();
            }
            catch(Platform::Exception^ exp)
            {
                    fileExists = false;
            }

            return (fileExists);
    });
}

你应该像下面这样打电话。

Testme("hello.txt").then([this](concurrency::task<bool> t)
{
    auto dispatcher = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher;

    // dispatch the task of updating the UI to the UI task not to run into exception
    dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal,
        ref new Windows::UI::Core::DispatchedHandler(
        [=]()
    {
        bool exists = t.get();

        if (exists)
        {
            txtbFileExists->Text = L"File is there";
        }
        else
        {
            txtbFileExists->Text = L"File is NOT there";
        }

    }));

});

我不知道本地文件夹在哪里,所以我无法测试文件实际存在的条件。请测试一下。