我如何 return 向 std::filesystem 发送错误消息?

How can i return an error to std::filesystem?

例如,这就是我使用 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:: 文件系统的错误return,我的意思是

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();
}

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

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

的构造函数

只需使用其中之一:

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

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

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 };
}

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