2

ほとんどのプログラム言語には何らかの例外処理があります。戻りコードを持つ言語もあれば、try/catch やレスキュー/リトライなどを持つ言語もあります。それぞれの言語には、読みやすさ、堅牢性、および大規模なグループ開発作業における実際的な有効性において独自の特徴があります。どれが一番いいですか?その理由は?

4

5 に答える 5

2

それはあなたの問題の性質に依存すると思います。さまざまな問題ドメインでは、ほぼ任意のエラー メッセージが必要になる可能性がありますが、他の単純なタスクでは、エラー時に NULL または -1 が返されるだけです。

エラーリターンコードの問題は、エラーを無視できるため、エラーを汚染/マスキングしていることです(APIクライアントがエラーコードをチェックする必要があることを知らない場合があります)。手元のメソッドから(合理的に)有効な出力が得られます。

マップのインデックス キーを要求し、それをリストに格納して実行を続ける API があるとします。その後、API はコールバックを送信し、そのメソッドは、この例では -1 である可能性があるキー (エラー コード) を使用して、テーブルをトラバースする可能性があります。BOOM、いくつかの配列で -1 にインデックスを付けると、アプリケーションがクラッシュします。この種の問題は、突き止めるのが非常に難しい場合があります。これはまだ些細な例ですが、エラー コードの問題を示しています。

一方、エラー コードは例外をスローするよりも高速であり、頻繁にアクセスされるメソッド呼び出しに使用することができます (そのようなエラー コードを返すことが適切な場合)。API のクライアントにこれらのエラー コードを公開していないため、これらの種類のエラー コードをプライベート アセンブリ内にカプセル化しようとしてもまったく問題ありません。これらの種類のアプリケーション核兵器は、アプリケーションが起動する前にトリガーされてから、長い間アプリケーション内に留まる可能性があるため、これらのメソッドを厳密に文書化することを常に忘れないでください。

個人的には、両方をある程度混ぜた方が好きです。私はそのためだけに例外を使用します-例外-プログラムが予期しない状態に陥り、何かが計画から外れたことを通知する必要がある場合。私は自分のコード全体に try/catch ブロックを書くのが苦手ではありませんが、それはすべて個人的な好みによるものです。

于 2008-09-15T19:44:18.107 に答える
1

何に最適?言語設計は常にトレードオフです。リターン コードの利点は、通常の関数呼び出し以外のランタイム サポートを必要としないことです。欠点は、1) 常にそれらをチェックする必要があること、2) 戻り値の型に、関数呼び出しの有効な結果ではない失敗値が含まれている必要があることです。

自動例外処理の利点は、コード内のエラー状態が消えないことです。

さまざまな言語 (および Lisp の条件システム、E のイジェクタなど) での例外処理セマンティクスの違いは、主に、プログラムの実行を続行する必要がある場合に、スタックの巻き戻しがどのように処理されるかに現れます。

ただし、要約すると、自動例外処理は、特に大規模なチームで、読み取り可能で堅牢なソフトウェアを作成する必要がある場合に非常に役立ちます。コンピューターにエラー状態を追跡させることで、コードを読むときに考えなければならないことが 1 つ減り、エラーの可能性がなくなります。エラーを示すためにリターン コードを使用するのは、例外処理を持たない言語で例外処理を実装している場合だけです。

于 2008-09-15T19:45:19.120 に答える
0

try/catch/finally は見事に機能します。

これにより、プログラマーは特定の条件と一般的な障害を適切に処理できます。

すべてのことを言い終えましたが、それぞれが他のものと同じくらい優れていると確信しています。

于 2008-09-15T19:39:34.657 に答える
0

try / catch の概念を採用する必要があります。読みやすさという点では、これがコード管理者に最も役立つと思います。例外が適切にタイプされ、関連するメッセージに十分な詳細データが含まれている限り、一連の関数呼び出しを見つけるのはかなり簡単です (私は個人的にスタック トレースを含めるのは好きではありませんが、誰がそれを行っているかをよく知っています。より追跡可能です。) 戻りコードの実装には、プログラムごとにコード定義の外部テーブルが必要です。個人的な経験からすると、これは維持するのも参照するのも扱いにくいものです。

于 2008-09-15T19:43:20.327 に答える
0

例外処理に関する通常とは異なる観点については、Haskell のControl.Exceptionモナドを参照してください。

于 2008-09-15T19:45:37.277 に答える