問題タブ [printstacktrace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - printStackTrace() と他のメソッドの間の実行順序が非決定的であるように見えるのはなぜですか?
以下のコード スニペットでは、printStackTrace()
メソッドは で呼び出されますcatch block
。プログラムを実行すると、 が--> -->printStackTrace()
の順に実行されるのではなく、連続して数回実行されることがあります。printStackTrace()
catch block
finally block
を に変更するstatic boolean b
と、 が順番false
にSystem.out.print(e)
実行されます。
では、なぜ はprintStackTrace()
異なる方法で動作するのでしょうか? (スレッドで何か??)
java - デバッグを容易にするために、作成中の新しいスレッドに呼び出し元スレッドのスタックトレースを追加します。
デバッグ中に頻繁に問題に直面しました。
スレッドが例外をスローして終了することがあります。
その問題の理由は、スレッドの呼び出し元/開始者です。
呼び出し元が誤ったパラメーターを送信したか、何かを初期化せずにスレッドを呼び出しました。
特定のスレッドが呼び出された場所を見つけるには、スタック トレースが役に立たないため、少し手間がかかります。
呼び出し元スレッドのスタックトレースを呼び出し先スレッドに追加できたらどうでしょうか。
次の例を考えてみましょう:
出力
望ましい出力
編集:@peter-lawreyとの議論の後に得られた解決策は次のとおりです
java - Java: Executor、FutureTask、Unsafe.unpark - printStackTrace を防ぐ方法は?
Java では、Executor を介して Callable を非同期的に実行するために FutureTask を使用しています。呼び出しスレッドからエラーが発生したかどうかを確認するには、Callable から潜在的な例外をスローする必要があります。ただし、これにより、スタックトレースが System.out に出力されます (デバッグしたところ、これは LockSupport.unpark(Thread) から Unsafe.unpark(Thread) 内で発生します)。
これを防ぐ方法はありますか?
以前に(SLF4Jを介して)実際のロガーに例外を記録しており、System.outで直接スタックトレースを取得したくありません。
更新: 関連情報は既に指摘したと思いますが、すべての質問を明確にするために: このテスト ケースは問題を再現できます (メソッド testTransferStreamAsyncCallbackFail()): https://github.com/mmm/util/blob/master/io/ src/test/java/net/sf/mmm/util/io/base/StreamUtilTest.java
使用される実装は次のとおりです。
eniter コードを介してデバッグしましたが、コンソールにログを記録するのは明らかに私のコードではありません。私が説明しようとしたように、これはJDKで行われます。
質問に答える追加の更新:
私が使用しているエグゼキュータ は Executors.defaultThreadFactory() です /base/SimpleExecutor.java#L30 https://github.com/mmm/util/blob/master/io/src/main/java/net/sf/mmm/util/io/base/StreamUtilImpl.java#L165
出力は、Callable からテストでスローした例外のスタック トレースです。
java - 一部のスタック トレースに Java の行番号がない理由
顧客からバグがあり、ログを調べると、例外を追跡すると、スタック トレースの一部に行番号がありません。
注意してください: パッケージ名を「xx」のようなものに置き換えました)。すべてのクラスとメソッドがアプリケーションで定義されています。
完全なスタック トレースは次のとおりです。
なぜこれが起こるのか興味がありますか?私の顧客が既存のコードに何かをすること(カスタマイズ)は可能ですか?
log4j - Logger.error(String, Throwable) 呼び出し時の EasyMock AssertionError
Log4j.error メソッドの呼び出し中に Throwable を含めると、アサーション エラーが発生します。@PreparateForTest ブロックに Logger.class、PrintWriter.class、AuthenticationException.class があります。Throwable を引数として渡さなければ、エラーは表示されません。
モックを正しく設定する際に何が欠けていますか?
JUnit テスト コード スニペットは次のとおりです。
問題の原因となっているコード スニペットは次のとおりです。
java - エラー ページ (Java) にリダイレクトする前に、エラーのスタック トレースをキャプチャする方法はありますか?
Spring MVC アプリケーションでエラーが発生した場合、エラーの原因となったコードのスタック トレースをメールで送信したいと考えています。
@ControllerAdvice
および注釈を使用して@ExceptionHandler
、例外のスタック トレースを出力し、その情報を電子メールで送信するメソッドにリダイレクトしています。ただし、スタック トレース情報は、エラーの原因となったコードからではなく、エラー ハンドラで実行されているコードに関するものです。
スタック トレースなどを出力するエラー ハンドラ内のコードを次に示します。
これにより、次の出力が得られます。
しかし、私はこの出力(コンソールに表示されるもの)を望んでいました:
exception - printStackTrace() の奇妙な動作
printStackTrace()
入力を待った後、独自のスレッドで実行されているかのように動作します。これが私のコードです:
期待される出力が得られることもありますが (STUFF
最後に)、次のようになることもあります。
そして時々これ:
スキャナを に置き換えてもSystem.in.read()
、同じ結果が得られます。行を完全に削除すると、期待される結果が得られます。この問題に気付いた実際のプログラムでは、スタック トレースがはるかに長く、STUFF
出力は常に期待どおり、または上記の 2 番目の出力 (2 行目の先頭) のように表示されました。
何が原因で、どうすれば解決できますか?
java - Android での e.printStackTrace() との混乱
Androidで例外をキャッチするために使用すべきではないhereを読みました。e.printStackTrace()
Log.e()
別のソースで、代わりに使用する必要があることを読みましたe.printStackTrace()
:
リリース ビルドでこれらの呼び出しを手動で削除する必要がありますか? Android で例外ログをトレースするベスト プラクティスは何ですか?