Представление и обработка ошибок - PullRequest
0 голосов
/ 11 апреля 2011

Я проектирую кроссплатформенную библиотеку защиты приложений для связи с ключом. Ключ может отправлять и получать блоки данных, создавать и удалять каталоги и файлы во внутренней файловой системе ключа и т. Д. Проще говоря, основной объект ключа имеет методы для реализации всех этих функций. К сожалению, любой из этих методов может потерпеть неудачу. Прямо сейчас я думаю о том, что делать, если они делают :) 1001 *

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

Следующее возможное решение - вернуть код ошибки, но будет более 30 типов ошибок. Кроме того, мне нужно разработать отдельную функцию для преобразования всех этих кодов возврата в более читаемое строковое представление.

Третье решение - вернуть результат логического типа, но сохранить объект состояния ошибки в основном объекте ключа, чтобы его можно было извлечь с помощью GetLastError () как метод. Я подумываю об использовании этого.

Теперь мой вопрос. Существуют ли другие разумные шаблоны представления и обработки ошибок и что вы предлагаете мне использовать в моем случае?

Спасибо, Илья

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

Из представленных вами вариантов лучше всего использовать коды возврата.Обычно код возврата с нулем указывает на успех, а код возврата каждого другого имеет свое собственное положительное целое значение.30 ошибок не много.Как вы уже сказали, вам нужно будет написать код для перевода этих кодов в нечто понятное человеку, но вы все равно должны это сделать.

Я бы подумал написать иерархию исключений, чтобы сделать это вместо ошибкикоды, однако.Исключения могут быть более выразительными, чем коды возврата, и код может быть чище, если все сделано правильно.Как правило, вы проектируете свою библиотеку так, чтобы для каждого типа условия возврата ошибки был свой класс исключений, каждый из которых в конечном итоге был получен из std::exception.Метод what() дает вам место для построения человеческого сообщения, а сам тип исключения описывает ошибку.

Есть те, кто скажет вам, что исключения являются «только» для исключительных обстоятельств., как ваш компьютер загорелся, или что-то.Это горячо обсуждаемое утверждение.Я скажу вам, что это чепуха.То, что оно называется «исключением», не означает, что ваш компьютер должен загореться, чтобы использовать его.Исключения дают вам много преимуществ, одно из самых больших - это раскрутка стека.Запрещать использовать их просто из-за какой-то произвольной строки, где ошибки «достаточно плохие», глупо.

0 голосов
/ 11 апреля 2011

Вы также можете попробовать использовать std :: exception.Это позволяет вам сказать, что это за ошибка и ее природа.

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