Skip to content

Instantly share code, notes, and snippets.

@kroer
Last active October 26, 2017 05:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kroer/fc39e351fde9f99b12c98e09ca402d04 to your computer and use it in GitHub Desktop.
Save kroer/fc39e351fde9f99b12c98e09ca402d04 to your computer and use it in GitHub Desktop.

OOP, magic methods and exceptions in PHP

Exceptions

Exceptions (Исключения) - это механизм для работы с "исключительными" ситуациями во время работы программы.

В PHP механизм исключений представлен классом Exception, оператором throw и блоком try ... catch ... finally.

Класс Exception нужен чтобы хранить данные об ошибке. Также, если программист хочет создать свой класс исключения (который будет хранить какие-то специфичные данные), то он должен будет наследовать его от класса Exception.

Оператор throw, как следует из названия, бросает или генериррует исключение.

throw new Exception('Error message');

После того как исключение было брошено выполнение программы приостанавливается, а само исключение начинает "подниматься" по стеку вызовов пока не встретит первый try ... catch блок, который обрабатывает данный тип исключений, либо стек вызовов не опустеет.

В последнем случаем выполнение программы будет экстренно остановлено, а информация об ошибке, хранящяяся в исключении, выведена пользователю на экран.

Что же будет если исключение встретит try ... catch блок. try .. catch блок использует для обрамления потенциально опасного кода, который может бросать исключения.

function b() {
    throw new Exception("I don't wanna work, i wanna throw exceptions.");
}

try {
    b();
} catch (Exception $e) {
    echo "b() says: " . $e->getMessage() . PHP_EOL;
}

Как видно из примера в фигурных скобках после оператора try пишется код который может бросить исключение, а в фигурных скобках после оператора catch пишется код который выполнится только в том случае, если исключение будет пойманно. При этом тип исключения, обрабатываемый этим блоком, указывается в круглых скобках после оператора catch. В нашем случае это стандартный класс исключений Exception.

Также блок try ... catch может иметь еще одну часть - finally.

try {
    ...
} catch(...) {
    ...
} finally {
    ...
}

Код в блоке finally всегда будет выполняться после кода в блоках try и catch, вне зависимости было ли брошено исключение или нет, перед тем как продолжится нормальное выполнение кода. Его работу можно рассмотреть на следующем примере.

function b() {
    throw new Exception("Error");
}

try {
    b();
} catch (Exception $e) {
    echo "Catch block" . PHP_EOL;
    return;
} finally {
    echo "Finally block" . PHP_EOL;
}

В результате на экран выведется.

Catch block
Finally block

Когда использовать исключения

Лучше всего использовать исключения в ситуациях когда ошибка в одной части кода затрагивает работу других частей кода, или же код, в котором произошла ошибка, не знает как ему поступить в данной ситуации. В этих случаях он должен сгенерировать исключение, в надежде, что остальные функции / методы, из которых он был вызван смогут сами разобраться со сложившейся ситуацией. А вообще, если можно обойтись возвращаемым значением, то лучше использовать именного его.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment