我遇到了一个我正在处理unicode字符串的问题,我想用标准异常做一些错误报告。标准异常中包含的错误消息不是unicode
通常这对我来说不是问题,因为我可以在非unicode中定义错误消息并且有足够的信息,但在这种情况下我想要包含原始字符串中的数据,这些可以是unicode。
如何处理异常中的unicode消息?您是否创建了自己的自定义异常类,是否从将它们扩展为unicode的标准异常派生,或者您是否有其他解决此问题的方法(例如规则“不在异常中使用unicode”)?
答案 0 :(得分:8)
我认为彼得·迪莫夫在Boost error handling guidelines中指出的理由很好地涵盖了这一点:
不要太担心什么() 信息。有消息很高兴 一个程序员有机会 弄清楚,但你不太可能 能够撰写相关的和 用户可理解的错误消息 抛出异常的一点。 当然,国际化是 超出例外范围 班级作者。彼得迪莫夫做了一个 正确使用的优秀论点 what()字符串用作a 键入错误消息表 格式化。现在,只要我们能得到 标准化的what()字符串 标准引发的异常 库...
答案 1 :(得分:2)
(因为Flodin的答案,我在洞察后添加了我自己的问题的答案)
在我的特定情况下,我有一个字符串,可能包含unicode字符,我正在解析,因此期望采用某种格式。解析可能会失败并抛出异常以指示发生了问题 最初我打算在异常中创建一个程序员可读的消息,详细说明解析失败的字符串的内容,这就是我遇到麻烦的地方,因为标准异常的异常消息不能包含unicode字符。
但是,我正在考虑的新设计是通过std :: exception-derived类中的异常机制返回字符串中解析错误的位置。创建包含导致错误的字符串部分的程序员可读消息的过程可以委托给类外的处理程序。这对我来说感觉就像一个更干净的设计。
感谢大家的投入!
答案 2 :(得分:1)
如果你真的想要Unicode,你可以UTF-8编码异常消息,在开头扔一个BOM,这样你可以判断异常消息是UTF-8,原始char
还是其他编码准备要输出的消息。
答案 3 :(得分:0)
我们使用自己的异常类。如果这不可能,您可以随时从Unicode转换为当前字符集中表示的MBSC - 您通常只需要这段文本一段时间,并且进一步的转换不是问题。
答案 4 :(得分:0)
我建议从std :: exception派生并扩展它以使用你的unicode字符串类。 从std :: exception派生可以带来以下好处:
catch (std::exception&)...
作为你的最后一个捕获并让它捕获你可能抛出的任何异常(和STL)。如果您创建自己的基本异常(并从中获得其他异常),则需要添加另一个异常。
无论哪种方式,我都不认为真的很重要,但我更喜欢这种风格(显然这会浪费std :: exception中的空std :: string,但我认为它不会一个很大的区别)。