1

いくつかの機能を持つ.pyファイルがあります。現在、コードをデバッグしていると、プログラムがどこかでスタックしていることがあります。

そこに置いて非常に長い間待つと、エラーメッセージが表示されます:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in generate
  File "<stdin>", line 7, in choosePath
MemoryError

ループがいくつかあるので、どこにスタックしているかわかりません。それを簡単に把握する簡単な方法はあります?あるループを別のループでデバッグするのは本当に気が進まない。whilefor

4

1 に答える 1

9

ヒットCTRL-Cしてトレースバックを見てください。

たとえば、次のコードは終わりのないループにヒットします。

import time

def foo():
    while True:
        time.sleep(1)

def bar():
    for i in range(10):
        foo()

bar() 

中断すると、次のように表示されます。

$ bin/python endless_demo.py 
^CTraceback (most recent call last):
  File "test.py", line 11, in <module>
    bar() 
  File "test.py", line 9, in bar
    foo()
  File "test.py", line 5, in foo
    time.sleep(1)
KeyboardInterrupt

トレースバックはfoo、5 行目の , で終了します。これは、プログラムを中断したときに Python がビジー状態だった場所です。トレースバックは、最初bar()に が呼び出され、それが を呼び出したことも示しているfoo()ので、どのようにしてそこにたどり着いたかがわかります。

裸の exceptハンドラーがある場合、これは必ずしも機能しないことに注意してください。すべての例外もキャッチでキャッチtry: except:KeyboardInterruptます。システム例外のキャッチを防ぐために、常にexcept Exception:最低でも使用してください。

于 2013-09-22T08:38:20.493 に答える