В CI регулярно используйте goto, чтобы выпрыгнуть из середины функции и распутать все, что я сделал в функции, когда возникает исключение, которое не может быть обработано изящно;например, закройте файловые дескрипторы, освободите выделенную память, которая не будет использоваться, например,
error3:
for(j=0; j<i; j++) {
nameDelete(names[j]);
}
error:2
free(names);
error1:
close(fd);
error0:
exit(-1);
В начале кода перед открытием fd я выпрыгну с ошибкой 0:, позже с ошибкой 1: и таквперед, как я хватаю ресурсы.
Python не имеет этой конструкции.Вместо этого я смотрю на условие за условием, где я должен снова и снова вставлять соответствующий код, и где, если я в какой-то момент меняю функцию для захвата ресурса, мне нужно убедиться, что все преждевременные выходы под ней обрабатывают этот ресурс должным образом.в одной точке.
Я не привязан к синтаксису goto (и я читал Dijkstra), однако мне интересно, есть ли общий шаблон для такого рода операций в Python.(Быстрый) обзор Python в двух словах не сильно помог.
[EDIT]
Чего я пытаюсь избежать, так это
try:
foo1
except:
bar0
try:
foo2
except:
bar0
try:
foo3
except:
bar1
try:
foo4
except:
bar2
, где bar2 включает в себя все в bar2, которое включает в себя все в bar0.Я признаю, что большая часть того, что я делаю в баре #, вероятно, обрабатывается GC, но я предпочитаю быть педантичным, особенно при переносе кода (что я и делаю), прежде чем я сделаю его рефакторинг.