Gotos - это просто деталь реализации. Try / catch очень похож на goto (в данном случае это goto между стеками!). Цикл while (или любая конструкция) может быть записан с помощью gotos, если хотите. Заявления о разрыве и досрочном возврате являются наиболее тонко замаскированными gotos из всех - они явные (и некоторые люди не любят их из-за сходства)
Так что технически в них нет ничего неправильного, но они создают более сложный код. Когда вы используете циклические структуры, вы привязаны к области ваших фигурных скобок. Не удивительно, куда вы на самом деле собираетесь, ищите или пересекаете.
Кроме того, у них есть ДЕЙСТВИТЕЛЬНО ПЛОХОЙ представитель. Если вы решите использовать его, даже в лучшем из возможных случаев, вам придется защищать свое решение от всех, кто когда-либо читает ваш код - и многие из тех людей, от которых вы будете защищаться, не будут иметь возможности чтобы сделать суждение называть себя, так что вы поощряете плохой код вокруг.
Одним из решений для вашего случая может быть использование того факта, что ранний возврат - это то же самое, что и goto (пс. Худший из когда-либо существовавших psuedocode):
dbMethod() {
start transaction
if(doWriteWorks())
end Transaction success
else
rollback transaction
}
doWriteWorks() {
validate crap
try Write crap
if Fail
return false
validate other crap
try Write other crap
if Fail
return false
return true
}
Я думаю, что этот шаблон будет работать в VB, но я не использовал его с VB 3 (примерно в то время, когда его купил MS), поэтому, если транзакции каким-то образом связаны с контекстом исполняемого метода или чем-то еще, я не знаю. Я знаю, что MS имеет тенденцию очень тесно связывать базу данных со структурой кода, иначе я бы даже не подумал, что это не работает ...