Какая разница?
Разница между описанными вами сценариями минимальна.
Однако является существенной разницей между повышением исключения и его отсутствием вообще (с использованием результатов ошибок).
Это имеет значение? Обратите внимание, что это может происходить несколько раз через стек вызовов.
Вы должны использовать исключения только для «исключительных ситуаций». Если ошибка является частой, особенно, например, в цикле, то она заслуживает того, чтобы ее преобразовали в полноценный сценарий использования.
Если вы этого не сделаете, то, что кажется на первый взгляд простым, быстро превращается в ситуацию, когда ваш блок , за исключением , становится больше, чем остальная часть вашей программы.
Обычно проверять условие и рассматривать его как явную ветвь в коде основной строки довольно просто.
т.е. вместо:
begin
try
//Do1
//Do2 (possibly raising an exception that you can handle)
//Do3
//Do4
except
//Dealing with main-line cases in exception handlers is
//very bad, leading to difficult to read code in the future.
end;
end;
Скорее напишите:
begin
//Do1
//LDo2Result := Do2
//NOTE: Do2 can still raise exceptions in EXCEPTIONAL situations.
// But for "main-line" use-case scenarios should rather return explicit
// results that can be handled.
if LDo2Result = d2rNoErrors then
begin
//Do3
//Do4
end;
if LDo2Result = d2rBracketMissing then
begin
//DoX
end;
end;
Вышеупомянутое, как правило, лучше по производительности и удобству обслуживания, чем любой из описанных вами сценариев. Однако, как и во всем, что связано с разработкой программного обеспечения: вы получаете набор руководств и методик, но вам нужно применить свой опыт, чтобы выбрать «лучший инструмент для конкретной работы на данный момент под рукой».