問題タブ [try-finally]
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.
multithreading - Delphi スレッド タイムアウトでリークが毎回発生する
したがって、次のように THandle を使用してスレッド化を実装しました。
スレッドが正常になると (タイムアウトに達せず、プロセスが途中で終了することもありません)、リークはありませんが、スレッドに何らかの問題があり、タイムアウトに達すると、多くのリークが発生します。推測すると、すべての試行を無視して、関数から離れてしまいます..最後に、すべてを解放します。
スレッドをファイナライズし、それが許すリークを殺す方法はありますか?
python - スレッド化されたアプリケーションで try-except-finally コードが期待どおりに機能しない
スレッド/プロセスが強制終了された場合に実行が突然停止することは理にかなっています
ターミナル ウィンドウで [X] をクリックしてメイン プログラムを正常に終了すると、クリーンアップ コードが実行されないのはなぜですか?
私はまだマルチスレッド アプリケーションの詳細を学んでいます。私の問題は、Python がバックグラウンド スレッドの強制終了を処理する方法を理解していないことが原因だと思います。
質問:
finally:
ブロックが常に実行されないのはなぜですか?- 他に
finally:
ブロックが実行されないのはいつですか? - スレッドが強制終了されると、スレッド内のコード実行はどうなりますか?
- メイン プロセスを終了すると、デーモン/非デーモン スレッドはどうなりますか?
詳細:
ZMQ ソケットを使用して (とりわけ) ログ ファイルに内容を書き込むマルチスレッド プログラムを作成しようとしています。ロギング スレッドが終了する直前に無条件にメッセージとクリーンアップを実行するようにしたいのですが、ほとんどの場合はそうではありません。
以下の関数は、バックグラウンド スレッドで無限ループを開始し、zmq.PAIR
通信用のソケットを返します。それが開始するループはソケットをリッスンし、そのソケットに書き込まれたものはすべてファイルに書き込まれます。ループはまた、「I'm started to log now!」、「おっと、エラーが発生しました!」などの診断メッセージを送り返す(はずです)。「私は今出ています」。そのため、メインプログラムはそれを監視できます。
プログラムは、このmain
パターンを使用していくつかのスレッドを生成し、さまざまな部分を監視/制御します。いくつかの ZMQ ソケット (STDIN とシリアル ポートに接続) でメッセージをポーリングし、その一部をファイルに接続されたソケットに転送します。
しかし今、私は立ち往生しています。プログラムのmain
ルーティングと制御ロジックは正常に動作します。get_logfile_sock
のファイル書き込みは正常に機能し、通常の例外処理は期待どおりに機能します。しかし、スレッドがメイン プログラムから強制終了された場合、またはメイン プログラムを完全に停止した場合、「I'm exiting now」コードは実行されません。
例:
java - Junitテストが「try」ブロックでアサーションエラーをスローした後でも、「最終的に」ブロックが起動しますか?
ブロック内のwriter.close()
メソッドfinally { }
は Junit アサーション エラーで実行されますか?
次のコードを想定します。
finally()
ブロックは通常のフローと同じように実行されますか?
delphi - Delphi - 例外と最終ブロックの「正しい」順序は何ですか?
次のルーチンがあるとします。
except
とをfinally
転置することの意味は何ですか? 両方の方法で多くの投稿を見てきましたが、どの場合にどちらが適切であるかについての明確な説明を見たことがありません (上記の構成で、ブロックがブロックの後にfinally
実行されることはまだ興味深いと思います!)。except
try..except
混合とtry..finally
ブロックは良い考えではないことを示唆する投稿も見ました。一部の Indy ルーチンなど、ルーチンが通常の操作の一部として例外をスローする状況で、どのように回避できますか?
java - Java コンパイラのコピーが最終的にブロックされるのはなぜですか?
次のコードを単純なtry/finally
ブロックでコンパイルすると、Java コンパイラは次の出力を生成します (ASM Bytecode Viewer で表示)。
コード:
バイトコード:
間にブロックを追加すると、コンパイラーがブロックを3catch
回コピーしたことに気付きました(バイトコードを再投稿していません)。これは、クラス ファイル内のスペースの無駄のようです。への呼び出しをさらに追加したときにブロックを複製したため、コピーも最大命令数に制限されていないようです(インライン化の仕組みと同様)。finally
finally
System.out.println
ただし、同じコードをコンパイルする別のアプローチを使用する私のカスタムコンパイラの結果は、実行時にまったく同じように動作しますが、次のGOTO
命令を使用することで必要なスペースが少なくなります。
を使用して同じセマンティクスを実現できるのに、Java コンパイラ (または Eclipse コンパイラ) がfinally
ブロックのバイトコードを複数回コピーし、例外を再スローするために使用するのはなぜですか? これは最適化プロセスの一部ですか、それともコンパイラが間違っているのでしょうか?athrow
goto
(両方の場合の出力は...)
c# - try-finally と try-catch-throw の違いは何ですか?
したがって、この質問finally
から、例外が発生した場合でも、例外がキャッチされずに伝播が許可された場合でも、ブロックを使用してコードを実行できることがわかりました。
この質問から、C# では、throw
キーワードをブロック内で (引数なしで) 単独で使用しcatch
て、スタック トレースをリセットすることなく、キャッチされた例外を伝播し続けることができることを理解しています。
私の質問は、これらの 2 つのブロックの違いは何ですか。
の両方を実行してから を実行してから、スローされた例外が同じスタック トレースで伝播できるようにしないでtry stuff
くださいfinally/catch stuff
。
python - メインループ全体を try..finally ブロックでラップするのは合理的ですか?
小さなプロジェクト用にマップ エディターを作成しましたがPython2.7.9
、未処理の例外が発生した場合に編集したデータを保持する方法を探しています。私のエディターには既にデータを保存する方法があり、現在の解決策は、次のtry..finally
例のように、メイン ループをブロックにラップすることです。
これは、何が起こっても、エディターsaveFile()
がクラッシュした場合にエディターの現在の状態を (そうするように装備されている範囲で) 保持しようとする最善の方法のようです。try
しかし、メインループ全体をブロックにカプセル化することは、実際に安全で効率的で、良い形なのだろうか。それは...ですか?リスクや問題はありますか?より良い、またはより従来の方法はありますか?