問題タブ [exception-safe]
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 - メソッドがスローできるすべての例外をどうやって知るのですか?
Java の標準クラスの例外の安全性に関する詳細を取得する方法はありますか? 主に C++ と C# を使用しており、Java の例外仕様について混乱しているため、例外の適切な処理方法を理解する必要があります。
より具体的に考えてみましょうServerSocket
。オブジェクトが構築されるとすぐに、着信接続のリッスンを開始します。次に、accept()
接続を受け入れるために使用する必要があります (誰かが接続しようとした場合)。
以前に でサーバー ソケットを構成したことがある場合は、指定された時間内に誰も接続を試みなかったため、スローさsetSoTimeout()
れる変更があります。それは問題ありません。サーバー ソケットはまだ使用できるので、もう一度呼び出すだけです。accept()
SocketTimeoutException
accept()
しかし、投げるSocketTimeoutException
ことができるのはそれだけではありません。accept()
他のすべての例外はどういう意味ですか? accept()
への呼び出しを2 つの catch 句でラップする場合: forSocketTimeoutException
とIOException
、句に入った後でも関連するインスタンスを安全に使用できますか?ServerSocket
IOException
Java全体とServerSocket固有の両方の回答をいただければ幸いです。
c++ - スワップメンバーの実装をスローしても問題ありませんか?
(copy-and-swap イディオムを使用して) クラスを作成するときの一般的なガイドラインは、スローしないスワップ メンバー関数を提供することです。( Effective C++、第 3 版、項目 25およびその他のリソース)
ただし、クラスがスワップ操作を提供しないサードパーティ クラス メンバーを使用しているために、nothrow 保証を提供できない場合はどうなりますか?
CString スワップを非スローにすることはできないため、スワップが失敗する可能性は低いです。
注: まれなサード パーティ クラスでは、スマート ptr (pimpl) を使用することもできますが、 -
注: CString は良い例です。彼の正気 (?) の誰も、pimpl (smart ptr) を介して CString のような概念的に単純でユビキタスなクラスのすべてのメンバーを保持し始めることはありません。 CString を変更して完全にノースロー スワップを許可する (短期から中期) チャンスはありません。
それで、あなたがそれを助けることができないなら、スワップメンバー関数をスローする可能性があっても大丈夫ですか? (または、この難問を回避する方法を知っていますか?)
編集:そして:強力な保証ではない場合、基本的な保証を提供するために、スロースワップメンバーをコピーアンドスワップイディオムで使用できますか?
java - 同期されたキーワードは例外に対して安全ですか?
重複の可能性:
同期句内で例外をスローすることの副作用?
synchronized
例外セーフかどうか疑問に思っていますか? たとえば、同期ブロック内でキャッチされない例外が発生した場合、ロックは解除されますか?
c# - C#でのスコープガードステートメント
Resource Acquisition Is Initialization(RAII)イディオムとtry-finallyステートメントは、例外安全プログラミングを作成するための従来のアプローチのバックボーンを形成します。
私の質問は:C#で利用可能なスコープガードステートメントのようなものはありますか?
c++ - C++ に含まれる C 標準ライブラリ関数は例外をスローしますか?
new operator
以下のコードでは、最初の行でオブジェクトの状態が既に変更されているため、この実装は例外セーフではないため、関数呼び出しによって例外が発生する可能性があることを著者は指摘しています。
読んでいるときに、Cライブラリ関数はC++で例外をスローするのだろうかと思いましたか? C には例外がないことはわかっていますが、C++ コンパイラを使用しているため、例外がある可能性があります。
では、c 標準 lib 関数を例外安全な関数呼び出しと見なすことができますか?
ありがとうございました。
ところで、記録のために、上記の関数を実装する正しい方法 (例外セーフ) を以下に示します。
c++ - unique_ptr<>() の初期化が失敗することはありますか?
std::unique_ptr<>()のドキュメントから、ポインターを初期化するときに何が起こるかはわかりません。
を割り当てるとstd::shared_ptr<>()
、参照カウンタを処理するためのメモリ バッファが割り当てられます。そのため、std::bad_alloc
例外が発生する場合があります。
一意のポインターを初期化するときに、同様のことが起こる可能性はありますか?
その場合、一意のポインターを介して削除しようとしていたものを実際に失う可能性があるため、質問しています。例えば:
したがって、の初期化unique_ptr<>()
がスローされる可能性がある場合、ファイルをf
永久に開いたままにしてしまう可能性があります。(FILE *
例として使用します。同様のリソースが影響を受ける可能性があります。)
this answerとは反対に、std::make_unique<>()
メモリを割り当てるだけではないため、明らかに使用できません。
std::unique_ptr<>()
の前にを初期化しfopen()
、その後に値を保存する方が安全でしょうか?
それとも、同様の問題がありますか?