如何将错误返回到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 ::文件系统返回错误

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'

解决方法

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

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