命名空间
变体
操作

std::filesystem::filesystem_error

来自 cppreference.com
 
 
 
 
在头文件 <filesystem> 中定义
class filesystem_error;
(自 C++17)

std::filesystem::filesystem_error 定义了一个异常对象,在文件系统库中函数的抛出重载失败时抛出。

cpp/error/exceptioncpp/error/runtime errorcpp/error/system errorstd-filesystem-filesystem error-inheritance.svg

继承关系图

内容

[编辑] 成员函数

构造异常对象
(公有成员函数) [编辑]
替换异常对象
(公有成员函数) [编辑]
返回导致错误的操作中涉及的路径
(公有成员函数) [编辑]
返回解释性字符串
(公有成员函数) [编辑]

继承自 std::system_error

成员函数

返回错误代码
(std::system_error 的公有成员函数) [编辑]
[虚拟]
返回解释性字符串
(std::system_error 的虚拟公有成员函数) [编辑]

继承自 std::runtime_error


继承自 std::exception

成员函数

销毁异常对象
(std::exception 的虚拟公有成员函数) [编辑]
[虚拟]
返回解释性字符串
(std::exception 的虚拟公有成员函数) [编辑]

[编辑] 备注

为了确保 filesystem_error 的复制函数是 noexcept,典型的实现会存储一个包含 what() 返回值的对象以及两个由 path1()path2() 分别引用的 std::filesystem::path 对象,这些对象存储在单独分配的引用计数存储中。

当前 MS STL 实现 不符合标准:上述对象直接存储在 filesystem 对象中,这使得复制函数不是 noexcept。

[编辑] 示例

#include <filesystem>
#include <iostream>
#include <system_error>
 
int main()
{
    const std::filesystem::path from{"/none1/a"}, to{"/none2/b"};
 
    try
    {
        std::filesystem::copy_file(from, to); // throws: files do not exist
    }
    catch (std::filesystem::filesystem_error const& ex)
    {
        std::cout << "what():  " << ex.what() << '\n'
                  << "path1(): " << ex.path1() << '\n'
                  << "path2(): " << ex.path2() << '\n'
                  << "code().value():    " << ex.code().value() << '\n'
                  << "code().message():  " << ex.code().message() << '\n'
                  << "code().category(): " << ex.code().category().name() << '\n';
    }
 
    // All functions have non-throwing equivalents
    std::error_code ec;
    std::filesystem::copy_file(from, to, ec); // does not throw
    std::cout << "\nNon-throwing form sets error_code: " << ec.message() << '\n';
}

可能的输出

what():  filesystem error: cannot copy file: No such file or directory [/none1/a] [/none2/b]
path1(): "/none1/a"
path2(): "/none2/b"
code().value():    2
code().message():  No such file or directory
code().category(): generic
 
Non-throwing form sets error_code: No such file or directory