Хотя кажется логичным сказать, что программы должны отлавливать только те исключения, которые они знают, как обрабатывать, и не могут знать, как обрабатывать исключения, которые не были ожидаемы программистом, такое утверждение игнорирует тот факт, что многие операции могут завершиться с ошибкой. практически неограниченное количество способов, которые не имеют побочных эффектов, и что во многих случаях надлежащая обработка для подавляющего большинства таких сбоев будет идентичной; точные детали ошибки не будут иметь значения, и, следовательно, не должно иметь значения, ожидал ли их программист.
Если, например, целью функции является чтение файла документа в подходящий объект и либо создание нового окна документа, чтобы показать этот объект, либо отчет пользователю о том, что файл не может быть прочитан, попытка загрузить файл недопустимый файл документа не должен вызывать сбой приложения - вместо этого должно отображаться сообщение, указывающее на проблему, но позволить остальной части приложения продолжить нормальную работу, если по какой-либо причине попытка загрузить документ не повредила состояние чего-либо еще в системе ,
По сути, правильная обработка исключения часто будет зависеть в меньшей степени от типа исключения, чем от места, где оно было сгенерировано; если ресурс защищен блокировкой чтения-записи, и в методе, который получил блокировку для чтения, генерируется исключение, обычно правильное поведение должно состоять в снятии блокировки, поскольку метод не может ничего сделать с ресурсом , Если во время получения блокировки для записи возникает исключение, блокировку часто следует аннулировать, поскольку защищенный ресурс может находиться в недопустимом состоянии; если у блокирующего примитива нет состояния «недействительно», следует добавить флаг для отслеживания такой аннулирования. Снятие блокировки без ее аннулирования - это плохо, потому что другой код может видеть защищенный объект в недопустимом состоянии. Однако, оставляя замок висящим, или правильное решение. Правильное решение состоит в том, чтобы аннулировать блокировку так, чтобы любые ожидающие или будущие попытки получения немедленно потерпели неудачу.
Если выясняется, что недействительный ресурс будет заброшен до того, как будет предпринята какая-либо попытка его использовать, нет никаких причин, по которым он должен закрыть приложение. Если недействительный ресурс имеет решающее значение для продолжения работы приложения, приложение должно быть закрыто, но аннулирование ресурса, вероятно, приведет к этому. Код, получивший исходное исключение, часто не имеет возможности узнать, какая ситуация применима, но если он делает недействительным ресурс, он может гарантировать, что в любом случае будет выполнено правильное действие.