如何在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中是否存在文件?
我真的希望有人回答......谢谢。
答案 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";
}
}));
});
我不知道本地文件夹在哪里,所以我无法测试文件实际存在的条件。请测试一下。