Попробуйте / исключить / окончательно заказать

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

Итак, вместо этого:

try
  try
    //some code
    //something that throws an exception, eg: EIndexOutOfRangeException 
    //more code
  except on E : EIndexOutOfRangeException do begin .... end;
finally
  // some cleanup code
end;

он будет иметь попытку / окончательно вложенный внутри и попытку / кроме как снаружи:

try
  try
    //some code
    //something that throws an exception, eg: EIndexOutOfRangeException 
    //more code
  finally
    // some cleanup code
  end;
except on E : EIndexOutOfRangeException do begin .... end;
end;

Я хотел бы знать, когда это уместно и хорошая идея использовать эту идиому, и есть ли исключительные случаи, когда вы не должны? Почему предпочитаете одно другому? Я полагаю, что исключение, которое выдается в коде очистки, будет основным соображением, поскольку я полагаю, что оно может подавить одно из исключений, если, наконец, выдает исключение, но может предотвратить непредвиденное всплытие ошибок?

1 ответ

Вы можете использовать оба способа написания: попробовать, поймать и, наконец, и это зависит от ситуации.

Рассмотрим следующий листинг кода для try... кроме как внутри try... finally.

//You will receive a DataSet is some state.
try   
   try
      //Here you'll change its state and perform operations on it.
      //If some exception occurred you will handle it.
   except
      //Handle exception.
   end;  
finally
 //Put the DataSet again in the same state.
end;

В приведенном выше листинге кода показано использование try... за исключением блока try... finally.

Рассмотрим следующий листинг кода для try... finally внутри try... кроме.

try  
   LObject:= TObject.Create;
   //Create an Object. It better idea to create an object outside try..finally block.
   //If some exception occured while creating an object an exception will be thrown.
   //However its not a good idea to catch such an exception.Let the system handle it.
   try
      //Use the Object. 
   finally
      //Free Object.
   end;  
  // Returns True
except
  // Returns False.
end;

Здесь приведенный выше листинг кода может использоваться в такой ситуации, когда функция возвращает только true и false. Если произошло какое-то исключение, просто установите значение false.

Другие вопросы по тегам