Попробуйте / исключить / окончательно заказать
Комментарий пользователя с большим количеством повторений на другой вопрос, который я задал ранее сегодня, предположил, что было бы лучше поменять местами порядок 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.