C # / Java эквивалентная конструкция "Try / finally / Catch" в Delphi - PullRequest
15 голосов
/ 11 ноября 2010

В Delphi, как вы можете использовать try, наконец и catch вместе?Эквивалент Java / C # будет выглядеть примерно так:

try {
    // Open DB connection, start transaction
} catch (Exception e) {
    // Roll back DB transaction
} finally {
    // Close DB connection, commit transaction
}

Если вы попробуете это в Delphi, вы можете использовать try / finally или try / исключением;но никогда не все три вместе.Я хотел бы следующий код (который не компилируется):

try
    // Open DB connection, start transaction
except on e: Exception do
begin
    // Roll back transaction
end
finally // Compiler error: expected "END" not "finally"
begin
    // Commit transaction
end

Ответы [ 3 ]

18 голосов
/ 11 ноября 2010

В Delphi вы можете использовать следующий шаблон:

// initialize / allocate resource (create objects etc.)
...
try
  try
    // use resource
    ...
  except
    // handle exception
    ...
  end;
finally
  // free resource / cleanup
  ...
end
10 голосов
/ 11 ноября 2010

запись

try 
  // allocate resource here
  try 
  finally
    // free resource here
  end;
except
  // handle exception here
end;
4 голосов
/ 16 ноября 2010

Хотя вложение try...except в try...finally (или наоборот) напрямую отвечает на вопрос, я хотел бы отметить, что оригинальный вопрос, независимо от того, какой язык вы используете, смешивает проблемы обработки ошибок и ресурсовуправление.Try...except и try...finally ужасны.Они отвлекают вас от того, что делает ваш код.Лучший подход состоит в том, чтобы выделить обработку ошибок в отдельный метод:

procedure Read(Connection: TDBConnection);
begin
  try
    //Read DB
  except
    //Handle Exception
  end;
end;

procedure ReadRecord;
begin
  DBConnection.Open;
  Read(DBConnection);
  DBConnection.Close;
end;

Теперь ваша обработка ошибок является автономной и может быть проигнорирована, чтобы вы могли сосредоточить свое внимание на happy path .

Подождите!А как насчет open и close?Что если они возбуждают исключения?

Простой.Оберните эти операции в try ... кроме функций и обработайте их.Это не должно быть необходимо.Если используемая вами библиотека БД чего-то стоит, исключение в open или close не оставит соединение в неизвестном состоянии.С другой стороны, существуют исключения для вещей, которых вы не ожидаете.

Та же самая техника может использоваться с любым ресурсом: создание объекта, доступ к файлу и т. Д. Когда тело вашей функции гарантированно не будет вызыватьсяисключение try...finally не нужно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...