5

コードでランタイム例外が発生し、完了が機能しない場合、トレースバックが出力されないため、理由がわかりません。この非常に短いコードを試して、私が何を意味するかを確認してください。プログラムはc = 2 + "ddda"行でクラッシュするはずです。明らかに、文字列とintを追加していますが、これは単に機能しません。しかし、クラッシュする代わりに、例外は一種のキャッチであり、何が起こっているのかわかりません。プログラムは、何も起こらなかったかのように実行を続けます。

import cmd

class App(cmd.Cmd):
    def complete_foo(self,*arg):
        # Uncommenting this line will silently crash the progrm
        # making it hard to debug.
        # Is there a way to force the program to crash ?
        c = 2 + "ddda"
        return "d dzpo idz dza dpaoi".split(" ")

    def do_foo(self,*args):
        print "foo"
App().cmdloop()

私の質問は:エラーがある場合にエラーを表示する方法は?(cmdモジュールを使用する場合)。

4

1 に答える 1

5

残念ながら、コンプリータの例外は の暗い深みのどこかに引っ掛かりますreadline。あなたはそのようなことを試すことができます:

import cmd
import traceback

def log_exceptions(fun):
    def wrapped(*a, **kw):
        try:
            return fun(*a, **kw)
        except Exception:
            print traceback.format_exc()
            raise

    return wrapped

class App(cmd.Cmd):
    @log_exceptions
    def complete_foo(self,*arg):
        # Uncommenting this line will silently crash the progrm
        # making it hard to debug.
        # Is there a way to force the program to crash ?
        c = 2 + "ddda"
        return "d dzpo idz dza dpaoi".split(" ")

 

$ python c.py
(Cmd) foo Traceback (most recent call last):
  File "c.py", line 7, in wrapped
    return fun(*a, **kw)
  File "c.py", line 20, in complete_foo
    c = 2 + "ddda"
TypeError: unsupported operand type(s) for +: 'int' and 'str'

readline 内からトレースバックを出力すると端末が台無しになる可能性があるため、コンプリータをデバッグした後にデコレータを削除します。

 

いいえ、readline を簡単にクラッシュさせることはできません。

于 2013-03-08T22:57:04.277 に答える