6

私が使用する Python 標準ライブラリとその他のライブラリ (PyQt など) では、エラー以外の条件で例外を使用することがあります。function を除いて、以下を見てくださいos.get_exec_path()。複数のtryステートメントを使用して、環境データの検索中にスローされる例外をキャッチします。

try:
    path_list = env.get('PATH')
except TypeError:
    path_list = None

if supports_bytes_environ:
    try:
        path_listb = env[b'PATH']
    except (KeyError, TypeError):
        pass
    else:
        if path_list is not None:
            raise ValueError(
                "env cannot contain 'PATH' and b'PATH' keys")
        path_list = path_listb

    if path_list is not None and isinstance(path_list, bytes):
        path_list = fsdecode(path_list)

これらの例外はエラーを意味するものではなく、通常の状態でスローされます。これらの例外の 1 つに例外ブレークポイントを使用すると、デバッガーはこれらのライブラリ関数でも中断します。

PyCharm または Python で一般的に、私のコードに関与せずにライブラリ内でスローおよびキャッチされた例外でデバッガーが中断しないようにする方法はありますか?

4

4 に答える 4

1

しばらくの間、次のような複雑なスキームがありました。

try( Closeable ignore = Debugger.newBreakSuppression() )
{
   ... library call which may throw ...
} <-- exception looks like it is thrown here

これにより、ライブラリ呼び出し内でスローされ、飲み込まれた例外に煩わされることがなくなりました。ライブラリ呼び出しによってスローされた例外が捕捉されなかった場合、右中括弧で発生したかのように表示されます。

その方法は次のとおりでした。

CloseableAutoCloseableチェック例外を宣言せずに拡張するインターフェースです。

ignoreは、未使用の変数について文句を言わないように IntelliJ IDEA に指示する名前にすぎません。愚かな Java は をサポートしていないため、これが必要ですtry( Debugger.newBreakSuppression() )

Debuggerは、デバッグ関連のヘルパー メソッドを備えた独自のクラスです。

newBreakSuppression()BreakSuppressionbreak-on-exception を一時的に中断したいという事実に注意を払うクラスのスレッドローカルインスタンスを作成するメソッドでした。

Debugger次に、クラスを呼び出してブレークしてもよいかどうかを尋ねるブレーク条件付きの例外ブレークポイントがあり、インスタンス化されたオブジェクトがDebuggerある場合、クラスは「いいえ」で応答します。BreakSuppression

コードが読み込まれる前に VM が例外をスローするため、プログラムの起動時にフィルターを評価できず、デバッガーはそれを無視するのではなく、それについて不平を言うダイアログをポップアップ表示するため、これは非常に複雑でした。(私はそれについて文句を言っているわけではありません。私はサイレントエラーが嫌いです。)したがって、ブレーク条件が次のようになる、ひどい、恐ろしい、自宅でこれを試してはならないハックが必要でした。java.lang.System.err.equals( this ) 通常、これはSystem.errスローされた例外と等しくないため、true を返すことはありません。したがって、デバッガーは決して中断しません。ただし、私のDebuggerクラスが初期化System.errされると、独自のクラスに置き換えられ、デバッガーが壊れた場合に実装が提供されequals(Object)、返されます。trueだから、本質的に、私は使用していましたSystem.err永遠のグローバル変数として。

結局、私はこのスキーム全体を捨てました。これは非常に複雑で、パフォーマンスが非常に悪いためです。Java ソフトウェア エコシステムでは例外が非常に頻繁にスローされるため、例外がスローされるたびに式を評価すると、すべてが非常に遅くなります。

于 2016-11-17T22:30:54.583 に答える
0

この機能はまだ実装されていません。投票できます:

于 2012-08-15T10:08:14.047 に答える