【问题标题】:Is there a typical pattern for handling wide character strings in exceptions?是否有典型的模式来处理异常中的宽字符串?
【发布时间】:2010-12-17 07:20:52
【问题描述】:

标准 C++ 的 std::exception::what() 返回一个窄字符串。因此,如果我想在那里放一个宽字符串消息,我不能。

是否有解决此问题的通用方法/模式/库?

编辑:明确地说,我可以编写自己的异常类并从它继承——但我很好奇是否有或多或少的标准实现。 boost::exception 似乎做了我想的大部分事情......

【问题讨论】:

  • 我打算建议将字符串重新编码为 UTF8,但考虑到使用它的情况,我很高兴我没有!
  • 如果你发现了请告诉我。我面临同样的问题。理论上可以为异常创建一个新的基类,但这会使所有的捕获端变得非常混乱。也许是一个新的类 wexception : public std::exception,并在里面发挥作用,但我担心它会变得非常低效。

标签: c++


【解决方案1】:

基于这篇帖子Exceptions with Unicode what(),我决定做这样的事情:

class uexception : public std::exception {
public:
    uexception(LPCTSTR lpszMessage)
        : std::exception(TCharToUtf8(lpszMessage)) { }
};

在我的代码库中,我假设.what() 将返回一个以UTF-8 编码的字符串。我从 UTF-8 到 TCHAR 的转换例程将跳过无法识别的 UTF-8 序列,并用 ? 替换它们。这样一来,如果.what() 返回的不是有效的 UTF-8,它就不会是史诗般的失败。

代码尚未编译(今天晚些时候 - 必须先修复一些其他问题!:)。我也为那里的 MFC 主义表示歉意,但我认为这个信息无论如何都会得到传达。

【讨论】:

  • 我会使用 ? 以外的字符——这种方式会带来大量安全漏洞的乐趣。但是 +1 是一个有用的答案。
  • 如果您想完全正确,请使用 U+FFFD,Unicode replacement character(黑色菱形中的白色 ?)“用于替换值未知或无法表示的传入字符在 Unicode 中。”
  • 其实我用的是替换字符。 (刚刚检查过:)
  • 接受这个答案是因为它看起来像是在这里花费最多的精力,并且因为我的问题“是否存在这种典型模式”的答案似乎是“否”。跨度>
【解决方案2】:

你可以在那里放任何东西,但是如果第三方代码需要来自what()const char*,你应该从它返回const char*

对于您的代码 - 只需从 std::exception 派生并添加 const wchar_t* wwhat() 方法。

【讨论】:

    【解决方案3】:

    嗯,在 Qt 中,你会得到用于字符串的 QString,并且该字符串始终是 unicode。并不是说你应该仅仅为了例外而选择 Qt,但仍然:)

    【讨论】:

    • 嗯,比利确实要求图书馆:)
    • 好吧,我正在使用std::wstring...我已经有一个Unicode字符串。这与异常有什么关系?
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多