我遇到了一个问题,正在处理Unicode字符串并想要使用标准异常进行错误报告。标准异常中包含的错误信息不是Unicode。
通常这对我来说不是问题,因为我可以用非Unicode定义错误消息并有足够的信息,但在这种情况下,我想包含原始字符串中的数据,而这些字符串可能是Unicode。
你是如何处理异常中的Unicode消息的?您是否创建自己的自定义异常类,从标准异常派生并扩展它们以处理Unicode,或者您是否有其他解决此问题的方法(例如“不要在异常中使用Unicode”)?
不要过于担心what()消息。拥有一个程序员有可能理解的消息很好,但你很难在抛出异常时编写相关且用户可理解的错误消息。当然,国际化超出了异常类作者的范围。彼得·迪莫夫提出了一个很好的论点,即正确使用what()字符串是将其作为错误消息格式化程序表格的键。现在,如果我们能够获得标准化的what()字符串以处理标准库抛出的异常就好了...
(在Flodin的回答后,我因为一些想法添加了自己的答案)
在我的特定情况中,我有一个字符串,其中可能包含Unicode字符,我正在解析它,并期望它以某种格式出现。解析可能会失败并抛出异常以指示发生问题。
最初,我打算在异常中创建一个程序员可读的消息,详细说明解析失败的字符串内容,但是我遇到了问题,因为标准异常的异常消息不能包含Unicode字符。
然而,我正在考虑的新设计是通过std :: exception派生类内的异常机制返回字符串中解析错误的位置。创建包含导致错误的字符串部分的程序员可读消息的过程可以委托给类外处理程序。这对我来说感觉更加清晰。
谢谢大家的意见!
我们使用自己的异常类。如果不可能,您可以将Unicode转换为当前字符集中表示的MBSC - 您通常仅需要短时间内使用此文本,并且进一步的转换不是问题。
catch (std::exception&)...
将您的最后一个catch语句并让它捕获您可能抛出的任何异常(和STL)。但是,如果您创建自己的基本异常(并让其他异常从中派生),则需要添加另一个catch语句。
无论哪种方式,我认为这不会真正有所影响,但我更喜欢这种风格(显然,这浪费了来自std :: exception的空字符串,但我不认为这会产生很大的影响)。