提问人:M. Victor 提问时间:10/20/2023 最后编辑:M. Victor 更新时间:10/23/2023 访问量:77
获取 std::ofstream open 失败的描述性原因
Get a descriptive reason why std::ofstream open failed
问:
是否有标准/跨平台的方法可以抛出描述性异常以及文件无法打开的原因?(例如:“只读目录”、“权限被拒绝”、“文件在另一个程序中打开”等)
我从某个调用者那里接收到一个文件,我需要写入/创建该文件,如果出现错误,则抛出异常。SomeMethod
我尝试像这样使用成员函数:ofstream::exceptions
void SomeMethod(std::string fileName)
{
std::ofstream outFile;
outFile.exceptions(std::ios::failbit | std::ios::eofbit);
outFile.open(fileName);
// start writing to file..
}
但是抛出的异常不够描述。我得到:
ios_base::failbit set: iostream stream 错误
我也尝试使用:std::system_error
void SomeMethod(std::string fileName)
{
std::ofstream outFile(fileName);
if (!outFile.is_open())
{
throw std::system_error(
#ifdef _WIN32
::GetLastError(),
#else
errno,
#endif
std::system_category(), "Error opening " + fileName);
}
// start writing to file..
}
这给出了我想要的描述性错误:
打开 some_file.txt 时出错:只读文件系统
但是,代码有点太冗长了。我希望有更短的东西......
我创建了这个游乐场:https://godbolt.org/z/b1zKKnEnz
答: 暂无答案
评论
GetLastError()
errno
int getMyLastError() { #ifdef _WIN32 return ::GetLastError(); #else return errno; #endif }
#ifdef _WIN32 #define getMyLastError() ::GetLastError() #else #define getMyLastError() errno #endif
throw
throw std::system_error(getMyLastError(), std::system_category(), "Error opening " + fileName);