Нет ничего плохого в исключениях. При правильном использовании они могут значительно облегчить обработку ошибок в вашем коде. Проблема с исключениями, особенно в Java, заключается в том, что ими легко злоупотреблять и злоупотреблять, что приводит к множеству анти-шаблонов .
Что касается ваших конкретных вопросов, я выскажу свое мнение по каждому из них.
Когда я должен выбросить исключение, и когда я должен написать код с
сильная гарантия nothrow, которая может просто возвращать bool для указания
успех или неудача?
Вы не можете написать метод в Java с гарантией «не выбрасывать». Как минимум, JVM может выдать ошибку времени выполнения, например, OutOfMemoryError. Вы не обязаны их подавлять, просто дайте им всплеснуть иерархией вашего звонка, пока вы не достигнете наиболее подходящего места для их обработки. Изменение типа возвращаемого значения метода на bool, указывающее на успех или неудачу, на самом деле является антитезой хорошего дизайна, тип возвращаемого вами метода должен быть продиктован их контрактом (что они должны делать), а не тем, как они это сделали.
Стоит ли пытаться свести к минимуму количество ситуаций, когда метод
выдает исключение или, наоборот, должно быть максимально
обеспечить гибкость при работе с этими ситуациями?
Ни! Ваш метод должен выдать точно количество исключений, как и ожидалось, учитывая его контракт (то есть, что он должен делать). Вот некоторые общие правила:
- Ваш метод не обязан обрабатывать возникающие исключения
в результате действий он не предпринимает. Т.е., OutOfMemory или
Ошибка StackOverflow, выдаваемая JVM
- Это является ответственность метода для обработки всех
исключения, выданные как часть его выполнения, которые являются результатом
отложенные вызовы в другие модули, которые явно не видны
вызывающий метод. Так, например, если вы используете Apache Commons
Библиотека ввода-вывода для обработки входных потоков в методе, предназначенном для чтения
файл, вам нужно обработать все исключения, которые выдает библиотека. Это
потому что вызывающий метод не может знать, что вы используете это
библиотека в вашем методе. Наиболее типичная манера обращения
такого рода исключения являются, оборачивая их в некоторых случаях
исключение во время выполнения (без проверки). Вы также можете обернуть их в проверенном
Исключение, если вы хотите четко указать вызывающему методу, что
оно должно быть готово к исключительным обстоятельствам.
- Это является обязанностью метода вызвать исключение
(проверено или не проверено), если по какой-либо причине оно не может выполнить
его контракт (иначе он не может успешно завершить). Дело в точку,
каждое из условных (если) утверждений в вашем
PrepareTheResultingOutputFile
Метод является допустимой точкой для выдачи исключения при неудаче желаемого
результат.
Должен ли я придерживаться соглашения об исключении, установленного
рамки / среды выполнения, которые я использую при разработке своих приложений или должны
Я упаковываю все эти вызовы так, чтобы они соответствовали моему собственному исключению
стратегия?
Если и метод, и вызывающий метод используют одну и ту же платформу, то совершенно необязательно оборачивать исключения рамок перед их повторным выбросом. Обратное также верно - если вы используете в своем методе фреймворк, о котором ваш вызывающий не знает, то вам следует скрыть детали реализации, заключив исключения, которые выдает фреймворк.
Мне также посоветовали использовать коды ошибок для обработки ошибок, что кажется
довольно эффективный, но уродливый с синтаксической точки зрения (также,
при их использовании разработчик теряет возможность указывать вывод
для метода). Что вы думаете об этом?
Я не видел много успешных фреймворков с кодами ошибок в Java, и, честно говоря, в большинстве случаев это полное излишество. Можно привести больший аргумент в пользу интернализации и локализации сообщений об ошибках.