Абсолютно ценно иметь возможность характеризовать состояния ошибок, но характеризация их по серьезности или действию, которое необходимо предпринять, означает, что решение принимается неправильным фрагментом кода.
Моя причина сказать, что метод, который сталкивается с ошибкой, не имеет контекста.
Рассмотрим ситуацию, когда не удается открыть соединение через сокет. Какую серьезность ошибки вы бы хотели вернуть socket.open (хост, порт)? В зависимости от контекста вы можете:
- Тихая попытка
- Регистрация и повтор
- Бросить диалог до пользователя
- Попробуйте другое соединение в списке
- Завершить программу
- и т.д.
Решение о том, какое действие предпринять в отношении ошибки, полностью зависит от контекста - что это означает, когда возникает конкретная ошибка.
По этой причине большинство людей сейчас следуют модели, в которой метод, который обнаруживает ошибку, сообщает об этой ошибке и позволяет вызывающей стороне определить, какое действие предпринять.
Таким образом, вместо того, чтобы думать об уровнях серьезности, вместо этого у вас будет набор условий ошибки, и вызывающая сторона либо предпримет какое-либо действие, либо выдаст саму ошибку (не обязательно ту же ошибку).
В этом случае socket.open(host,port)
приведет к ошибке, подобной socket_open_fails
, и у вызывающей стороны будет контекст, который будет знать, что делать в случае сбоя при открытии сокета. Он будет знать, используется ли сокет для получения жизненно важных данных, без которых программа не может продолжить работу, или является более необязательным (возможно, для получения обновлений программы).
Итак: не определяйте свои условия ошибки по действию, которое нужно предпринять: определяйте их по тому, что не удалось.
В качестве примечания, я потратил много времени на то, чтобы написать это, чтобы описать все это без ссылок на исключения.