Начал думать над стратегией обработки исключений.
Все исключения возникают по одной из трех причин:
1. Некорректности во внешних данных (внешних сервисов или вводимых пользователем).
Примеры: пользователь ввел вместо числа -- символ.
2. Ошибки в коде программы (кривой код).
Примеры: вышли за границу массива, обратились к защищенной памяти, вызвали из другого потока к потоконебезопасный метод.
3. Ошибки системы.
Примеры: недостаточно памяти, аварийное завершение процесса, переполнен стек, недостаточно места на диске, обрыв соединения, нет связи с базой данных.
4. Ошибки прав доступа. -- под вопросом, не знаю куда отнести
Это очень важно. Хотя в .Net (и не только) на причину внимания не обращают.
По идее должно быть 3 базовых класса для всех исключений. Программист смог бы генерировать
только исключения "некорректности данных". Системные исключения генерируются Операционной Системой. А исключения "кривого кода" средой исполнения.
Тогда бы все было намного яснее. Если возникло исключени #3 (системное) -- то как правило с ним ничего сделать нельзя -- только показать пользователю, отобразить информацию. Если исключение #2 (кривой код) -- то программист должен исправить ошибку в своей программе. Ну и если #1 -- неверные данные -- то либо пользователь должнен вводить данные правильно (для пользователя эти исключения нужно обрамлять в красивые сообщения об ошибках) либо сообщить в тех. поддержку сервиса, что они выдают ошибочные данные (либо перестроить логику обработки этих данных).
Кстати, ошибки #2 могут породить ошибки #3. И, вроде бы все -- остальные никак не связаны.
Что вы думаете о такой структуризации? И куда отнести ошибки прав доступа? Какие еще есть типы ошибок, которые не вписываются в данную парадигму?