Принцип | Описание |
Используйте для исключительных ситуаций | Только для ошибок, которые нельзя предотвратить проверкой |
Предоставляйте информативные сообщения | С указанием причины ошибки и способа исправления |
Ловите конкретные исключения | Избегайте catch(Exception) без необходимости |
- Для ошибок, специфичных для вашей предметной области
- Когда стандартные исключения недостаточно информативны
- Для группировки нескольких связанных ошибок
- Наследуйтесь от соответствующего базового класса исключений
- Добавляйте конструкторы с информативными сообщениями
- Реализуйте сериализацию при необходимости
- Добавляйте дополнительные свойства для диагностики
Практика | Пример | Антипаттерн |
Ловите конкретные исключения | catch(FileNotFoundException ex) | catch(Exception ex) |
Используйте finally для освобождения ресурсов | finally { stream.Close(); } | Отсутствие освобождения ресурсов |
Логируйте исключения перед передачей | logger.Log(ex); throw; | Проглатывание исключения |
- Throwable
- Error (неперехватываемые)
- Exception
- RuntimeException
- Проверяемые исключения
- Exception
- SystemException
- ApplicationException
- Пользовательские исключения
- Retry Pattern - повторная попытка при временных ошибках
- Circuit Breaker - прекращение попыток при частых ошибках
- Fallback - альтернативный путь выполнения при ошибке
- Validation - предварительная проверка вместо исключения
Операция | Влияние на производительность |
Создание исключения | Высокая стоимость из-за сбора стека |
Обработка исключения | Умеренные накладные расходы |
Исключения в нормальном потоке | Сильно снижают производительность |
- Избегайте использования исключений для управления потоком
- Используйте исключения только для ошибок
- Предпочитайте проверки if/else для ожидаемых условий
- Оптимизируйте часто выбрасываемые исключения
Правильное использование исключений делает код более надежным и удобным для поддержки. Следуя этим рекомендациям, вы сможете создавать системы с грамотной обработкой ошибок.