簡體   English   中英

C++(標准)異常和 Unicode

[英]C++ (Standard) Exceptions and Unicode

我遇到了一個問題,我正在處理 unicode 字符串,我想用標准異常進行一些錯誤報告。 標准異常中包含的錯誤消息不是 unicode。

通常這對我來說不是問題,因為我可以用非 unicode 定義錯誤消息並且有足夠的信息,但在這種情況下,我想包含來自原始字符串的數據,這些數據可以是 unicode。

您如何處理異常中的 unicode 消息? 您是否創建了自己的自定義異常 class,您是否從將它們擴展到 unicode 的標准異常中派生出來,或者您是否有解決此問題的其他解決方案(例如規則“不要在異常中使用 Z8AB3B19E134F01FBAF94B8E15?F3DF09”)

我認為Boost 錯誤處理指南中指出的 Peter Dimov 的基本原理很好地涵蓋了這一點:

不要太擔心 what() 消息。 很高興有一個程序員有機會弄清楚的消息,但你不太可能在拋出異常時編寫相關且用戶可理解的錯誤消息。 當然,國際化超出了例外 class 作者的 scope。 Peter Dimov 提出了一個很好的論點,即正確使用 what() 字符串是作為錯誤消息格式化程序表的鍵。 現在,如果我們能夠為標准庫拋出的異常獲得標准化的 what() 字符串……

(由於弗洛丁的回答,我在洞察后添加了我自己的問題的答案)

在我的特殊情況下,我有一個字符串,其中可能包含 unicode 字符,我正在對其進行解析,因此期望采用某種格式。 解析可能會失敗並拋出異常以指示發生了問題。
最初我打算在異常中創建一個程序員可讀的消息,詳細說明解析失敗的字符串內容,這就是我遇到麻煩的地方,因為標准異常的異常消息不能包含 unicode 字符。

但是,我正在考慮的新設計是通過 std::exception 派生的 class 中的異常機制返回字符串中解析錯誤的位置。 創建包含導致錯誤的字符串部分的程序員可讀消息的過程可以委托給 class 之外的處理程序。 這對我來說感覺像是一個更干凈的設計。

謝謝大家的投入!

If you really want Unicode you could UTF-8 encode the exception message, throw in a BOM in the beginning so you can tell if the exception message is UTF-8, raw char , or other encoding when you prepare the message for output.

我們使用自己的異常 class。 如果這是不可能的,您總是可以從 Unicode 轉換為當前字符集中表示的 MBSC - 您通常只需要這個文本一小段時間,進一步轉換不是問題。

我建議從 std::exception 派生並將其擴展為使用您的 unicode 字符串 class。 從 std::exception 派生可以為您帶來以下好處:

catch (std::exception&)...

作為您最后一次捕獲並讓它捕獲您可能拋出的任何異常(和 STL)。 如果您創建自己的基本異常(並從中派生其他異常),則需要添加另一個捕獲。

無論哪種方式,我認為這並不重要,但我更喜歡這種風格(顯然這會浪費 std::exception 中的空 std::string 但我認為這不會有很大的不同)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM