【问题标题】:C++/WinRT handling exceptions from StorageFolder::GetFileAsyncC++/WinRT 处理来自 StorageFolder::GetFileAsync 的异常
【发布时间】:2021-03-29 00:04:52
【问题描述】:

当不存在文件时,应用程序会抛出一个我无法捕获的异常 在下面的示例代码中,我创建了一个目录“MyFolder”并保存一个文件“”并将一个文件“sample.txt”保存到其中。 然后我两次调用函数 FindFileAsync - 首先使用已经创建的文件“sample.txt”,它工作正常,然后使用一个不存在的文件“nofile.txt”,该文件因错误而失败 FindFile.exe 中的 0x00007FF94E39D759 处引发异常:Microsoft C++ 异常:内存位置处的 winrt::hresult_error。 这个问题有解决办法吗?

MainPage.h

#pragma once

#include "MainPage.g.h"

namespace winrt::FindFile::implementation
{
    struct MainPage : MainPageT<MainPage>
    {
        MainPage();
        Windows::Foundation::IAsyncAction FindFileAsync(hstring value);
        Windows::Foundation::IAsyncAction GetFolderAsync(hstring const& value);
        Windows::Foundation::IAsyncAction CreateFileAsync(hstring const& fname);
        Windows::Foundation::IAsyncAction DeletefileAsync(Windows::Storage::StorageFile const & value);

        void ClickHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& args);
    private:
        hstring folderDir{ L"MyFolder" };
    };
}

namespace winrt::FindFile::factory_implementation
{
    struct MainPage : MainPageT<MainPage, implementation::MainPage>
    {
    };
}

MainPage.cpp

#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
using namespace Windows::Storage;
using namespace Windows::Storage::Streams;
using namespace Windows::UI::Popups;

namespace winrt::FindFile::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();
    }

    Windows::Foundation::IAsyncAction MainPage::FindFileAsync(hstring value)
    {
        Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() };
        StorageFolder sampleFolder{ co_await storageFolder.CreateFolderAsync(folderDir, CreationCollisionOption::OpenIfExists) };
        try
        {
            Windows::Storage::StorageFile manifest{ co_await sampleFolder.GetFileAsync(value) };
        }
        catch (winrt::hresult_error msg)
        {
            hstring ms{ msg.message() };
            MessageDialog dlg(ms, L"File Error");
            dlg.ShowAsync();
        }
    }

    Windows::Foundation::IAsyncAction MainPage::GetFolderAsync(hstring const& value)
    {
        Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() };
        auto sampleFolder{ co_await storageFolder.CreateFolderAsync(value, CreationCollisionOption::OpenIfExists) };
    }

    IAsyncAction MainPage::CreateFileAsync(hstring const& fname)
    {
        Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() };
        auto sampleFolder{ co_await storageFolder.CreateFolderAsync(folderDir, CreationCollisionOption::OpenIfExists) };
        auto sampleFile{ co_await sampleFolder.CreateFileAsync(L"sample.txt", Windows::Storage::CreationCollisionOption::ReplaceExisting) };
        co_await Windows::Storage::FileIO::WriteTextAsync(sampleFile, L"Swift as a shadow");
    }

    IAsyncAction MainPage::DeletefileAsync(StorageFile const& value)
    {
        co_await value.DeleteAsync();
    }

    void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
    {
        hstring fname{ L"sample.txt" };
        GetFolderAsync(folderDir);
        CreateFileAsync(fname);
       // The following statement is successful as the file exists
        FindFileAsync(fname);
       // The following ststement throws an exception error 
        FindFileAsync(L"nofile.txt");      
        
    }
}

【问题讨论】:

标签: c++-winrt


【解决方案1】:

在 C++/WinRT 中,一些异常(但不是全部)会强制调试器暂停程序执行,尽管异常正在处理(抛出在 try 块中)。但是,您可以通过按 F5 或在没有调试器的情况下启动应用程序(CTRL+F5 或通过开始菜单)来恢复它。我不确定这是错误还是预期行为。

【讨论】:

    【解决方案2】:

    我找到了适合我的解决方案。 当调试器触发异常时,消息包含一个选中的复选框。如果未选中并且程序继续运行到最后,则问题已解决。再次运行时,不会触发错误,并且 catch 可以处理“找不到文件”。不知道为什么默认设置是触发异常。

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 2017-04-22
      • 2010-12-09
      • 2011-09-01
      • 2020-12-04
      • 2014-08-27
      • 2023-03-14
      • 2023-03-19
      • 2015-05-19
      相关资源
      最近更新 更多