私は定期的にgotoを使用して関数の途中から飛び出し、正常に処理できない例外が発生したときに関数で行ったことを解きます。例えば近いファイルディスクリプタ、私はERROR1で、後:, error0で飛び出したいfdが開く前に、初期のコードでは、このようなgotoのないPythonでの緊急出口
error3:
for(j=0; j<i; j++) {
nameDelete(names[j]);
}
error:2
free(names);
error1:
close(fd);
error0:
exit(-1);
として、使用されることはありません自由に割り当てられたメモリ:などとして私は資源をつかむ。
この構文はPythonにはありません。代わりに、適切なコードを何度も入れなければならない状況の後で条件を調べています。そして、ある時点でリソースを取得するために関数を変更すると、その下のすべての早すぎる終了がそのリソースを適切に処理する必要があります一点で
私はgotoの構文に縛られていません(と私はDijkstraを読んだことがあります)。しかし、この種の操作の共通パターンがPythonにあるかどうかは疑問です。 Python in a Nutshellの(迅速な)調査はそれほど役に立ちませんでした。
私は避けるようにしようとしている何[EDIT]
はBAR2はBAR0のすべてを含んでBAR2のすべてを含んで
try:
foo1
except:
bar0
try:
foo2
except:
bar0
try:
foo3
except:
bar1
try:
foo4
except:
bar2
です。私はbar#で行うことの多くがGCによって処理される可能性が高いと認めますが、私はリパクタリングする前にコードを移植するとき(特に私がやっていることです)これは、「解明」と例外がは、例外ハンドラによってを捕まえなるまでスタックをクリーンアップしていきます
raise Exception("ERROR")
:
あなたはどのようなPythonのチュートリアルを使用している:これは、実際にファイルを開いたままにしないのだろうか?それらのすべては、** try:**および** except **の記述をカバーする必要があります。また、** with **ステートメントはこれを実行します。どのチュートリアルを使用していますか?これらの記述をカバーしていますか? –
Eek - それは恐ろしいです、やめてください。 (私はあなたのCのコーディングスタイルについて話しています) – KevinDTimm
@KevinDTimm:実際にはかなり一般的で、Linuxカーネルのどこにでも使われています。あなたはCでクリーンアップを行うには、それが賢明で速い方法であると主張するかもしれません。 – orlp