0

例如,这就是我使用 runtime_error 的方式

#include <exception>
#include <filesystem>

std::exception &foo(){
    try {
        if(!std::filesystem::is_directory(std::filesystem::path("sdfsdf"))){
            throw std::runtime_error("Error14");
        }
    }
    catch (std::exception &e) {
        return e;
    }
}

int main(){
    foo().what();
    // then i do smth with this error
}

如何做类似的事情,但从 std :: 文件系统返回错误,我的意思是

std::filesystem::filesystem_error

我试过这个->

#include <filesystem>
std::filesystem::filesystem_error &foo()
{
    try {
        if(!std::filesystem::is_directory(std::filesystem::path("sdfsdf"))){
            throw std::filesystem::filesystem_error("ERROR14", std::error_code());
        }
    }
    catch (std::filesystem::filesystem_error &e) {
         // if (e.code == success)
        {
            return e;
        }
    }
}

int main()
{
    foo();
}

如果没有异常如何返回这样的'e'(我的意思是抛出)

4

2 回答 2

0

CppReference记录了std::filesystem::filesystem_error.

只需使用其中之一:

throw std::filesystem::filesystem_error("Error14", std::error_code());

您可能想要输入更好的消息和错误代码:-)

于 2020-10-24T14:22:59.300 回答
0

std::filesystem::is_directory有一些重载。如果您提供一个std::error_code对象作为最后一个参数,它将不会抛出,而是在发生操作系统错误时设置错误代码对象的值。所以你可以使用这个重载来设置std::error_code对象并std::filesystem::filesystem_error从中创建:

std::filesystem::filesystem_error foo()
{
    std::error_code err{};
    if (!std::filesystem::is_directory(std::filesystem::path("sdfsdf"), err))
    {
        return std::filesystem::filesystem_error{ "ERROR14", err };
    }

    return std::filesystem::filesystem_error{ "SUCCESS", err };
}

请注意,这是按值返回的;如果您通过引用返回,它将是对在函数返回后被销毁的局部变量的引用,并且使用这种悬空引用会导致未定义的行为。

于 2020-10-24T22:21:06.887 回答