<rmcreative>

RSS

try-finally

4 июня 2018

Try без catch может быть полезным, если ошибку мы ловить именно в этом методе не хотим, но завершение нам нужно как-то обработать вне зависимости, была ошибка или нет.

$this->openConnection();
try {
    $this->doSomethingUnstable();
} finally {
    $this->closeConnection();
}

Почему-то подобный код я не особо часто встречал, хотя catch без обработки — постоянно.

Комментарии RSS

  1. №11274
    Роман
    Роман 06 июня 2018 г., 7:24:09

    В PHP не сильно принято освобождать ресурсы. Видимо расчет на GC и жизненный цикл процесса на время обработки реквеста. Я в прошлом программил на Delphi, и там это был очень распространенный кейс. В интерпретации PHP:

    // Создать объект
    try {
        // Что-то с ним сделать
    } finally {
        // Убить объект
    }
    
    
  2. №11275
    ldar
    ldar 06 июня 2018 г., 7:38:52

    Да, в php нет большой необходимости так как он создан, чтобы умирать.

  3. №11276
    Роман
    Роман 06 июня 2018 г., 9:21:34

    Необходимость есть, и в некоторых случаях это очень удобно. Поставить/снять блокировку, создать/удалить временный файл, и прочее.

  4. №11277
    ldar
    ldar 06 июня 2018 г., 10:49:38

    Ну как бы я написал "нет БОЛЬШОЙ необходимости" Ваши случаи можно решить разными способами, к примеру destructor или явно вызвать метод.

  5. №11278
    Роман
    Роман 06 июня 2018 г., 11:11:34

    Причем тут деструктор? Речь про блоки кода, где нужно гарантировать финализацию. До 5.5, где появился finally, подобные вещи приходилось костылить другими способами, типа:

    // 1. Initialization
    try {
        // 2. Exception can be thrown
    } catch (Exception $e) {
        // 3. Finalization
        throw $e;
    }
    // 3. Finalization
    
    

    Но с finally это выглядит лучше:

    // 1. Initialization
    try {
        // 2. Exception can be thrown
    } finally {
        // 3. Finalization
    }
    
    
    
  6. №11279
    ldar
    ldar 06 июня 2018 г., 12:24:03

    Сам сейчас прочел свое сообщение и понял что ступил, видимо недосып сыграл. Да, вы правы

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.