Коды ошибок в иерархии исключений и исключений - PullRequest
12 голосов
/ 15 февраля 2012

Как вы думаете, можно ли использовать коды ошибок в исключении для указания типа ошибки? Пожалуйста, посмотрите на этот код:

public class MyException extends Exception {
    public static final String ERROR_CODE_INVALID_NAME = "";
    public static final String ERROR_CODE_INVALID_ID = "";
    ...

    private String errorCode;

    public MyException(String message, String errorCode) {
        super(message);
        this.errorCode = errorCode;
    }

    public String getErrorCode() {
        return errorCode;
    }
}

Я знаю, что в этом примере лучше использовать enum вместо Strings, но на самом деле меня беспокоит концепция кодов ошибок. Как вы думаете, иерархия исключений будет лучше здесь? Я не могу найти никакого авторитетного источника, который говорит, что коды ошибок в исключении являются анти-паттернами. Thx.

Ответы [ 5 ]

8 голосов
/ 15 февраля 2012

Коды ошибок полезны, когда

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

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

Если у вас есть требования к кодам ошибок - решениене плохоПопробуйте собрать все коды ошибок в центральном хранилище (файл свойств), чтобы вы могли легко обмениваться полным набором:

myexception.ERROR_CODE_INVALID_NAME=text or number
myexception.ERROR_CODE_INVALID_ID=text or number
4 голосов
/ 29 июня 2012

Из моего опыта коды исключений используются в основном как информационное сообщение для пользователя.

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

С другой стороны, может быть сложно создать новый подкласс исключений для каждого конкретного случая, а затем использовать коды исключений.
Например, если для пользовательского кода он не измеряет причину сбоя транзакции, он должен каким-либо образом откатить ее, но для конечного пользователя важно, почему это произошло (неправильные параметры, соединение с базой данных или другое).

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

2 голосов
/ 15 февраля 2012

Я обычно использую комбинацию обоих.

Вам необходимо классифицировать ваши исключения и принять проектное решение.

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

Если вы выбрали Обработка исключений для важного параметра, вы можете выбрать один из двух вариантов в зависимости от того, как вы хотите их обработать:

  1. Используйте коды ошибок, если вы хотите перехватывать все типы в одном блоке перехвата и обрабатывать их общим способом.
  2. Используйте иерархию, если вы хотите поймать определенный тип за раз и обрабатывать их соответствующим образом.
2 голосов
/ 15 февраля 2012

Если вы хотите реагировать по-разному (в коде) в зависимости от того, что вызвало исключение (либо недопустимое имя, либо недопустимый идентификатор), тогда я бы предложил использовать разные исключения.

Если нет, то вам даже не нужен метод getErrorCode(), вы можете просто добавить код ошибки в сообщение об исключении, и исключение предоставит вам всю информацию, необходимую для отладки.

2 голосов
/ 15 февраля 2012

С точки зрения производительности создание трассировки стека сложной иерархии исключений очень дорого с точки зрения как памяти, так и времени, поэтому, если вы создадите сложную настраиваемую иерархию исключений для чего-то, что вы можете решить с помощью 3-4 статических кодов ошибок ... Я хотел бы предпочитаю вариант кода ошибки. В целом, я предпочитаю работать с исключениями времени выполнения (не отмеченными в сигнатуре метода), а защитный подход к отлову проверенных исключений - немного устаревший IMO.

...