C++(标准)异常和Unicode

10

我遇到了一个问题,正在处理Unicode字符串并想要使用标准异常进行错误报告。标准异常中包含的错误信息不是Unicode。


通常这对我来说不是问题,因为我可以用非Unicode定义错误消息并有足够的信息,但在这种情况下,我想包含原始字符串中的数据,而这些字符串可能是Unicode。


你是如何处理异常中的Unicode消息的?您是否创建自己的自定义异常类,从标准异常派生并扩展它们以处理Unicode,或者您是否有其他解决此问题的方法(例如“不要在异常中使用Unicode”)?

5个回答

8
我认为彼得·迪莫夫在Boost错误处理指南中所指出的理由很好地解释了这个问题:

不要过于担心what()消息。拥有一个程序员有可能理解的消息很好,但你很难在抛出异常时编写相关且用户可理解的错误消息。当然,国际化超出了异常类作者的范围。彼得·迪莫夫提出了一个很好的论点,即正确使用what()字符串是将其作为错误消息格式化程序表格的键。现在,如果我们能够获得标准化的what()字符串以处理标准库抛出的异常就好了...


1
我完全理解这个论点背后的逻辑,但我的情况不是关于多语言消息,而是关于可能存在错误的Unicode字符串,我想以程序员有用的消息的形式显示这些错误。 - Joris Timmermans
实际上,再仔细考虑了一下,你确实提出了一个很好的观点,并给了我一个解决方案的思路——我会将它写成一个答案。 - Joris Timmermans
@MadKeithV 嗯,为此,在您的派生异常类中只需添加另一个成员函数以返回Unicode字符串即可。 - flodin
"map indexed by what()" 的意思是“由什么索引的映射”。如果我真的想的话,我可以想出一个更费力的解决方案。 - user4590120

2

(在Flodin的回答后,我因为一些想法添加了自己的答案)

在我的特定情况中,我有一个字符串,其中可能包含Unicode字符,我正在解析它,并期望它以某种格式出现。解析可能会失败并抛出异常以指示发生问题。

最初,我打算在异常中创建一个程序员可读的消息,详细说明解析失败的字符串内容,但是我遇到了问题,因为标准异常的异常消息不能包含Unicode字符。

然而,我正在考虑的新设计是通过std :: exception派生类内的异常机制返回字符串中解析错误的位置。创建包含导致错误的字符串部分的程序员可读消息的过程可以委托给类外处理程序。这对我来说感觉更加清晰。

谢谢大家的意见!


1
如果你真的想要Unicode,你可以将异常消息进行UTF-8编码,在开头加入BOM(字节顺序标记),这样在准备输出消息时就能知道异常消息是UTF-8、原始的char类型还是其他编码方式。

0

我们使用自己的异常类。如果不可能,您可以将Unicode转换为当前字符集中表示的MBSC - 您通常仅需要短时间内使用此文本,并且进一步的转换不是问题。


0
我建议您从std :: exception中派生,并将其扩展为使用您的Unicode字符串类。 从std :: exception派生使您能够执行以下操作:
catch (std::exception&)...

将您的最后一个catch语句并让它捕获您可能抛出的任何异常(和STL)。但是,如果您创建自己的基本异常(并让其他异常从中派生),则需要添加另一个catch语句。

无论哪种方式,我认为这不会真正有所影响,但我更喜欢这种风格(显然,这浪费了来自std :: exception的空字符串,但我不认为这会产生很大的影响)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接