gpt4 book ai didi

c++ - 在现代 PC 的 C++ 异常类中避免 std::wstring 数据成员是否有意义?

转载 作者:可可西里 更新时间:2023-11-01 16:37:42 24 4
gpt4 key购买 nike

this "Error and Exception Handling" 中的“我应该如何设计我的异常类?”段落中Boost网页,上面写着:

[...] 3. Don't embed a std::string object or any other data member or base class whose copy constructor could throw an exception.

我必须定义一个异常类来表示某种形式的文件访问运行时错误,所以我想从 std::runtime_error 派生它,并添加一个 FileName () 属性以访问发生错误的文件名。

为简单起见,我打算添加一个 std::wstring 数据成员来存储文件名(Unicode 格式),但上述建议有点让我停了下来。那么,我应该使用一个简单的 wchar_t 缓冲区作为数据成员吗?

现代桌面系统(这是我这个项目的目标平台)上,注意文件名的动态字符串分配真的很重要吗?这种分配失败的可能性有多大?我可以理解 Boost 对有限资源系统(如嵌入式系统)的建议,但它是否也适用于现代台式电脑?

//
// Original design, using std::wstring.
//
class FileIOError : public std::runtime_error
{
public:
FileIOError(HRESULT errorCode, const std::wstring& filename, const char* message)
: std::runtime_error(message),
m_errorCode(errorCode),
m_filename(filename)
{
}

HRESULT ErrorCode() const
{
return m_errorCode;
}

const std::wstring& FileName() const
{
return m_filename;
}

private:
HRESULT m_errorCode;
std::wstring m_filename;
};



//
// Using raw wchar_t buffer, following Boost's guidelines.
//
class FileIOError : public std::runtime_error
{
public:
FileIOError(HRESULT errorCode, const wchar_t* filename, const char* message)
: std::runtime_error(message),
m_errorCode(errorCode)
{
// Safe string copy
// EDIT: use wcsncpy_s() with _TRUNCATE, as per Hans Passant's suggestion.
wcsncpy_s(m_filename, filename, _TRUNCATE);
}

HRESULT ErrorCode() const
{
return m_errorCode;
}

const wchar_t* FileName() const
{
return m_filename;
}

private:
HRESULT m_errorCode;
wchar_t m_filename[MAX_PATH]; // circa 260 wchar_t's
};

最佳答案

What is the likelihood of such allocation to fail?

相当低。

通常出于代码正确性的目的,您只真正关心该可能性是零还是非零。即使在内置 ::operator new 永远不会因猖獗的过度提交而失败的系统上,也要考虑您的代码将被用于替换 ::operator new< 的程序的可能性。或者操作系统可能会通过 ulimit -v 或其他方式从外部限制允许进程分配的内存量。

接下来考虑它失败的后果。 terminate() 被调用。也许您可以接受,尤其是因为它不太可能真正发生。

基本上,您是否希望您的程序在无法分配内存的情况下尝试干净地退出并显示合理的错误消息?如果是这样,请编写额外的代码并接受错误消息的长度限制。因为 Boost 是通用库代码,所以它不会代表用户假设他们不想尝试。

关于c++ - 在现代 PC 的 C++ 异常类中避免 std::wstring 数据成员是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com