Сначала ваш код выглядит немного странно. Я скучаю по созданию X.
X := CreateAnX
try
DoSomeThing(X);
finally
FreeAndNil(x);
end;
Это важно. Потому что, если у вас есть такой код
<code>// don't do something like this
try
X := CreateAnX
DoSomeThing(X);
finally
FreeAndNil(x);
end;
Вы можете быть счастливчиком , и это работает. Но если строительство не удастся, вы можете быть " везучим " и получить нарушение прав доступа, или у вас будет невезение и через несколько раз получить нарушение доступа на совершенно другая позиция кода.
Альтернативой может быть
<code>X := nil;
try
X := CreateAnX
DoSomeThing(X);
finally
FreeAndNil(x);
end;
Где использовать , за исключением , зависит от ваших намерений. Если вы хотите перехватить каждое исключение и знать, что весь вызывающий код очищает его проблемы (используя try finally), тогда внешний блок исключения - это путь для
try
X := CreateAnX
try
DoSomeThing(X);
finally
FreeAndNil(x);
end;
except
on e: Exception do
LogException(e)
end;
Но всегда думайте об этом, когда хотите отловить все ошибки. В качестве примера (и я часто вижу это неправильно) не делайте этого в обработчике OnExecute Indy таким образом. Там вы должны использовать что-то вроде этого
try
X := CreateAnX
try
DoSomeThing(X);
finally
FreeAndNil(x);
end;
except
on EIdException do
raise;
on e: Exception do
LogException(e)
end;
Если вы ожидаете исключение из-за того, что вы его выбросили или (в качестве примера) разговор может потерпеть неудачу, найдите самую внутреннюю позицию, чтобы поймать ошибку:
X := CreateAnX
try
DoSomeThing(X);
try
i := StrToInt(X.Text);
except
on EConvertError do
i := 0;
end;
finally
FreeAndNil(x);
end;
не делай так
X := CreateAnX
try
try
DoSomeThing(X);
i := StrToInt(X.Text);
except
on EConvertError do
i := 0;
end;
finally
FreeAndNil(x);
end;
Делайте это только в том случае, если вы ожидаете ошибку EConvertError и в DoSomeThing. Если DoSomeThing выдает ошибку EConvertError и вы этого не ожидаете, у вашего кода есть серьезная проблема, которую необходимо исправить. В этой ситуации убедитесь, что пользователь может сохранить свою работу (возможно, в виде копии, поскольку его работа может быть повреждена), и убедитесь, что вы получите информацию о проблеме.
По крайней мере, попытайтесь, за исключением обработки исключений, а не их сокрытия.