2012-01-25 5 views
2

私は定期的に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") 

+3

あなたはどのようなPythonのチュートリアルを使用している:これは、実際にファイルを開いたままにしないのだろうか?それらのすべては、** try:**および** except **の記述をカバーする必要があります。また、** with **ステートメントはこれを実行します。どのチュートリアルを使用していますか?これらの記述をカバーしていますか? –

+2

Eek - それは恐ろしいです、やめてください。 (私はあなたのCのコーディングスタイルについて話しています) – KevinDTimm

+2

@KevinDTimm:実際にはかなり一般的で、Linuxカーネルのどこにでも使われています。あなたはCでクリーンアップを行うには、それが賢明で速い方法であると主張するかもしれません。 – orlp

答えて

4

Pythonのは、このために例外システムを使用しています。例外が捕捉されない場合、プログラムは停止し、例外を出力して終了します。

例外の詳細については、the official Python tutorialをご覧ください。

また、リソースの使用についても説明しました。

  • 初期化とクリーンアップ、リソースが初期化時に割り当てられます、と解放(メソッド__init____del__
  • with声明、(メソッド__enter____exit__
  • に解放された:これは、2つのパターンを通じて最も行われます

例外が発生した場合でも、両方のパターンが正しくクリーンアップされます。

+0

私は、関数(メソッド)内で何が起こっているかについて、スタックについてあまり心配していません。関数内でtry:とexcept:構文を使うことができますが、これは私が理解しているように私に同じ問題を残します。それは関数内で何をしたのか解明する必要があります。私は何を避けるためにしようとしていること ようなコードである「場合条件:何とか かの条件:何とか かの条件:何とか 」 または 「試し:FOO 除く:バー 試し:foo2は 除きます:バー 試し:バー 「 –

+0

1:除くfoo3 。 @MichaelConlen。また、RAIIについて考えてみましょう。すべての州がオブジェクトによって保持されている限り、あなたが言いました条件は発生しません。 http://ja.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization –

+0

@MichaelConlen:「私がその機能の中でやったことを解明しなければならない?」これは何を意味するのでしょうか? **あなたが解き明かす必要があると思われるものに関する具体的な内容を** **更新してください。 Pythonには既にガベージコレクションとコンテキストマネージャがあります。あなたは何をする必要があると思いますか? –

0

私は、私は完全にあなたの必要性を理解していないが、あなたはtry ... except ... finally

ここに例外処理と例外についての詳細を読む使用することができますように聞こえる:あなたがエラーを処理する必要がある場合は、http://docs.python.org/tutorial/errors.html

0

例外を使用します。公式のPythonマニュアルの例:

try: 
    f = open('myfile.txt') 
    s = f.readline() 
    i = int(s.strip()) 
except IOError as (errno, strerror): 
    print "I/O error({0}): {1}".format(errno, strerror) 
except ValueError: 
    print "Could not convert data to an integer." 
except: 
    print "Unexpected error:", sys.exc_info()[0] 
    raise 

Btwでは、必要に応じて独自のカスタム例外を呼び出すことができます。例外とともに

0

は、with文は、多くの場合、特定のファイル記述子で使用されます。それは「悪い習慣」ですが、あなたドン場合FYI、ファイルオブジェクトがある限り、できるだけ早く彼らは、すぐに彼らはスコープの外に行くように起こるGCedを得るように閉じます

http://effbot.org/zone/python-with-statement.htm

http://docs.python.org/reference/compound_stmts.html#the-with-statement

それらへの他の参照がありません。

def _readfile(): 
    f = open("path") 
    return f.read() 

しかし、それはあなたのものだならば、あなたは間違いなく、それを判断します:)

関連する問題