存储用户、错误、异常消息 (c++)

Posted

技术标签:

【中文标题】存储用户、错误、异常消息 (c++)【英文标题】:storage of user, error, exception messages (c++) 【发布时间】:2009-08-06 18:53:09 【问题描述】:

相当简单的问题。 我应该在哪里存储错误、异常、用户消息? 到目前为止,我总是在将要调用它的函数中声明本地字符串并且没有打扰。 例如

SomeClass::function1(...)

std::string str1("message1");
std::string str2("message2");
std::string str3("message3");
...
// some code
...

我突然意识到,由于每次都会调用构造和初始化,因此可能会非常昂贵。将它们作为静态字符串存储在类中甚至单独的模块中会更好吗? 本地化不是这里的情况。

提前致谢。

【问题讨论】:

【参考方案1】:

为什么不在需要的时候使用字符串常量?

SomeClass::function1(...)

/* ... */
    throw std::runtime_error("The foo blortched the baz!");
/* ... */

或者,您可以使用static const std::strings。如果您希望将它们复制到许多其他std::strings,这是合适的,并且您的 C++ 实现会在写入时复制:

SomeClass::function1(...)

    static const std::string str_quux("quux"); // initialized once, at program start
    xyz.someMember = str_quux; // might not require an allocation+copy

如果您希望制作大量这些strings 的副本,而您没有写时复制(或不能依赖它存在),您可能想研究一下使用boost::flyweight。

【讨论】:

大多数当前的实现不执行写时复制。它们提供的优势(性能方面)要优于使其成为线程安全的麻烦。要处理多线程环境,您必须添加锁来保护所有操作(读取和写入),这最终会导致相当大的性能损失。 警告:函数局部静态变量(如您的示例中的 str_quux)不会在程序启动时初始化,而是在包含函数的第一次执行时初始化。这会导致线程安全问题。【参考方案2】:

TBH 最好只在需要时构建错误消息(即,如果出现严重错误,谁在乎你是否会减速)。如果消息总是会出现,那么最好静态定义它们以避免它们每次都会被初始化的事实。不过,一般来说,我只在调试模式下显示用户消息,因此如果您尝试进行性能构建,很容易不显示它们。然后我只在需要时才构建它们。

【讨论】:

+1 在函数顶部定义变量(正确地,IMO)在 C++ 中是不受欢迎的。在需要时定义它们。 (如果您不打算操纵消息,为什么还要创建字符串?)

以上是关于存储用户、错误、异常消息 (c++)的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程报937错误

mysql 存储过程执行异常,参数不是出参

为啥使用用户定义的异常而不是简单地显示错误消息[重复]

用于检索自定义消息而不是异常详细信息的 PLSQL 异常处理

将 Django Log 消息存储在数据库中?

C++:未处理的异常:内存位置的 std::out_of_range