C ++ (Стандарт) Исключения и Юникод - PullRequest
10 голосов
/ 06 марта 2009

У меня проблема с обработкой Unicode-строк, и я хочу сделать несколько отчетов об ошибках со стандартными исключениями. Сообщения об ошибках, содержащиеся в стандартных исключениях, не являются Unicode.

Обычно это не проблема для меня, потому что я могу определить сообщение об ошибке не в Unicode и иметь достаточно информации, но в этом случае я хочу включить данные из исходных строк, и эти могут быть юникода.

Как вы обрабатываете Unicode сообщения в ваших исключениях? Вы создаете свой собственный класс исключений, наследуете ли вы стандартные исключения, распространяющие их на юникод, или у вас есть даже другие решения этой проблемы (например, правило «не используйте юникод в исключениях»)?

Ответы [ 5 ]

8 голосов
/ 06 марта 2009

Я думаю, что обоснование Питера Димова, как указано в Руководстве по обработке ошибок Boost , хорошо охватывает это:

Не беспокойтесь о чем () сообщение. Приятно иметь сообщение что у программиста есть шанс выяснить, но вы вряд ли чтобы иметь возможность составить соответствующий и понятное пользователю сообщение об ошибке на точка исключение брошено. Конечно, интернационализация за рамками исключения автор класса. Петр Димов делает отличный аргумент, что правильное использование строки what () служит введите в таблицу сообщения об ошибках форматтеры. Теперь, если бы мы только могли стандартизированные строки what () для исключения, выдвигаемые стандартом библиотека ...

2 голосов
/ 06 марта 2009

(я добавляю ответ на свой вопрос после анализа из-за ответа Флодина)

В моем конкретном случае у меня есть строка, которая может содержать символы Юникода, которые я анализирую и, таким образом, ожидаю, что будет в определенном формате. Синтаксический анализ может завершиться неудачно и вызвать исключение, чтобы указать, что возникла проблема.
Первоначально я намеревался создать читаемое программистом сообщение внутри исключения, которое подробно описывает содержимое строки, в которой произошел сбой анализа, и именно здесь я столкнулся с проблемой, поскольку сообщение об исключении из стандартного исключения не может содержать символы Юникода.

Однако новый дизайн, который я рассматриваю, заключается в возвращении местоположения ошибки синтаксического анализа в строке через механизм исключений в классе, производном от std :: exception. Процесс создания читаемого программистом сообщения, содержащего части строки, вызывающие ошибку, может быть делегирован обработчику вне класса. Для меня это выглядит намного чище.

Спасибо за вклад, всем!

1 голос
/ 06 марта 2009

Если вы действительно хотите использовать Unicode, вы можете кодировать UTF-8 сообщение об исключении, добавьте вначале спецификацию, чтобы вы могли определить, является ли сообщение об исключении UTF-8, необработанное char или другое кодирование при подготовке сообщение для вывода.

0 голосов
/ 06 марта 2009

Я хотел бы предложить наследовать от std :: exception и расширить его для использования вашего строкового класса Unicode. Вывод из std :: exception дает вам преимущество:

catch (std::exception&)...

как ваш последний улов и пусть он поймает любое исключение, которое вы, возможно, сгенерировали (и STL). Где, как будто вы создаете свое собственное базовое исключение (и ваше другое исключение вытекает из этого), вам нужно будет добавить еще один улов.

В любом случае, я не думаю, что это действительно имеет значение, но я предпочитаю этот стиль (очевидно, это пустая трата std :: string из std :: exception, но я не думаю, что это сделает большая разница).

0 голосов
/ 06 марта 2009

Мы используем наш собственный класс исключений. Если это невозможно, вы всегда можете перевести с Unicode на MBSC, представленный в текущем наборе символов - этот текст вам обычно нужен ненадолго, и дальнейшее преобразование не вызывает вопросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...