Когда я должен использовать исключение?
Вы используете исключение, чтобы указать исключительное условие; то есть что-то, что мешает методу выполнить свой контракт, и что не должно было произойти на этом уровне.
Например, у вас может быть метод Record::save()
, который сохраняет изменения в записи в базе данных. Если по какой-либо причине это невозможно сделать (например, произошла ошибка базы данных или нарушено ограничение данных), вы можете выдать исключение, указывающее на ошибку.
Как создать пользовательские исключения?
Исключения обычно называются так, что они указывают на характер ошибки, например, DatabaseException
. Вы можете создать подкласс Exception
для создания именованных исключений таким способом, например
class DatabaseException extends Exception {}
(Конечно, вы можете воспользоваться наследованием, чтобы предоставить этому исключению некоторую дополнительную диагностическую информацию, например, например, сведения о соединении или код ошибки базы данных.)
Когда не должен использовать исключение?
Рассмотрим еще один пример; метод, который проверяет существование файла. Вероятно, это должно не генерировать исключение, если файл не существует, так как целью метода было выполнение указанной проверки. Однако метод, который открывает файл и выполняет некоторую обработку , может вызвать исключение, так как файл должен существовать и т. Д.
Изначально не всегда понятно, когда что-то есть и не является исключительным. Как и большинство вещей, опыт научит вас со временем, когда вы должны и не должны бросать исключение.
Зачем использовать исключения вместо возврата специальных кодов ошибок и т. Д.?
Полезная вещь об исключениях состоит в том, что они немедленно выпрыгивают из текущего метода и возглавляют стек вызовов, пока они не будут перехвачены и обработаны, что означает, что вы можете переместить логику обработки ошибок выше, хотя в идеале, не слишком высоко .
Используя понятный механизм для работы со сбоями, вы автоматически запускаете код обработки ошибок, когда происходит что-то плохое, что означает, что вы можете избежать работы со всеми видами магических значений часового, которые должны быть проверены, или, что еще хуже, флаг глобальной ошибки, чтобы различать кучу разных возможностей.