Определение кодов ошибок - PullRequest
0 голосов
/ 19 июля 2011

Есть ли "правильный способ" определения кодов ошибок?Я имею в виду, что я недавно создал библиотеку, которая генерирует пользовательские исключения, но нацелил пользовательские сообщения об ошибках на точку зрения разработчика.Теперь я завершаю GUI, и когда я ловлю эти исключения, мне нужны более удобные сообщения.Само по себе это не проблема, но допустим, у меня есть исключение ReceiverNotAvailableException и NoMessageReceivedException.Для меня, как для разработчика, они означают совершенно разные вещи и имеют разные внутренние сообщения, но для конечного пользователя они просто означают «Пользователь не найден».Я хотел бы отобразить что-то вроде «Пользователь не найден (ошибка X)», где X изменяется в зависимости от того, какое исключение выдается - довольно обычное явление, если вы спросите меня.1, 2 и т. Д. В зависимости от того, какое исключение или я должен выбрать что-то более сложное по какой-либо причине?Я знаю, это звучит как глупый вопрос, но мне бы очень хотелось узнать, что такое «лучшая практика» (я не очень люблю этот термин) в данном случае.будет таблица, отображающая каждый код в соответствующее исключение, в зависимости от того, какой случай.

1 Ответ

3 голосов
/ 19 июля 2011

Если ваши исключения не могут перекрываться, то переход к HashTable [ExceptionName] = «Сообщение об ошибке» выглядит как нормальный вариант.Если они могут, вы можете использовать что-то вроде следующего:

Стандартный способ определения кодов сообщений, которые могут перекрываться (то есть происходить одновременно), заключается в использовании степеней двойки:

define ERROR_SYSTEM_DOWN  1
define ERROR_DATABASE_UNREACHABLE 2
define ERROR_SPACE_UNAVAILABLE 4
define ERROR_DISK_DIED 8

и так далее.Затем в коде вы можете сделать

if (disk_died() && no_space()) {
    int errorCode = ERROR_DISK_DIED | ERROR_SPACE_UNAVAIABLE; //Binary or
    return errorCode;
}

Наконец, на принимающей стороне вы можете:

if (errorCode & ERROR_DISK_DIED == ERROR_DISK_DIED) { //Binary and
    //then, at least, disk died. You can check for the rest in the same way
}

Объяснение:

ERROR_SYSTEM_DOWN = 0001
ERROR_DATABASE_UNREACHABLE = 0010
ERROR_SPACE_UNAVAILABLE = 0100
ERROR_DISK_DIED = 1000

Тогда

1000 | 0100 = 1100

и в проверочном коде

1100 & 0100 = 0100

Теперь, если вы используете исключения, вы можете использовать тот же подход, всплывая errorCode до тех пор, пока возникает исключение.Хотя эта идиома чаще встречается у C.

...