3

システムを作っています。私が知りたいのは、メッセージがサポートされていない場合、どうすればよいですか? サポートされていないメッセージをスローする必要がありますか? 0 または -1 を返す必要がありますか? または、errno (base->errno_) を設定する必要があります。エラーがあったとしても気にしないいくつかのメッセージ (setBorderColour など)。その他(addTextまたは保存コマンドを作成する場合はおそらく保存)。

1) 迅速にコーディングする 2) デバッグする 3) 拡張および保守するための最良の方法を知りたいです。ATM をデバッグするのは難しいですが、私が記入しなかった多くの欠落コードがあります。実際のバグを修正するのは難しくありません。エラーがあることをユーザーに知らせる最善の方法は何ですか?

システムはこのように機能しますが、まったく同じではありません。これは C スタイルで、mycode には settext(const char*text){ を msg(this, esettext, text) にラップする一連のインライン関数があります。

Base base2, base;
base = get_root();
base2 = msg(base, create, BASE_TYPE);
msg(base2, setText, "my text");
const char *p = (const char *)msg(base2, getText);
4

4 に答える 4

8

通常、C ++の場合は、パフォーマンスが重要でない限り、または例外をサポートしない環境(組み込みプラットフォームなど)で実行している可能性がある場合を除いて、例外を優先します。例外は、発生時に非常に目立ち、無視されるため、デバッグには断然最良の選択です。さらに、例外は自己文書化です。それらには独自のタイプ名があり、通常はエラーを説明するメッセージが含まれています。リターンコードとerrnoには、個別のコード定義と、特定のコンテキスト(manページ、コメントなど)でコードが何を意味するかを伝達するための帯域外の方法が必要です。

迅速にコーディングする場合、リターンコードは、独自の例外タイプを定義する可能性がなく、多くの場合、エラーチェックコードは例外の場合ほど冗長ではないため、おそらく簡単です。ただし、もちろん大きなリスクは、エラーリターンコードを黙って無視する方がはるかに簡単であり、問​​題が発生してからかなり経つまで気付かない可能性があり、デバッグとメンテナンスが悪夢になることです。

errnoはエラーが発生しやすいため、使用しないようにしてください。これはグローバルであるため、誰がリセットしているのかがわかりませんまた、スレッドセーフではありません。

編集:私はあなたがCスタイルのerrnoではなくerrnoメンバー変数を意味していることに気づきました。グローバルではないという点で優れていますが、スレッドセーフにするために追加の構造が必要であり(アプリがマルチスレッドの場合)、リターンコードのすべての問題が保持されます。

于 2008-11-21T01:14:11.293 に答える
2

エラー コードは明示的にチェックしてから渡す必要があるため、エラー コードを返すには規律が必要です。このアプローチを使用する大規模な C ベースのシステムを作成しましたが、「失われた」エラーをすべて削除するのに時間がかかりました。最終的に、この問題をキャッチするためのいくつかの手法を開発しました (エラー コードをスレッド グローバルの場所に保存し、返されたエラー コードが保存されたエラー コードと一致することを最上位で確認するなど)。

コードを書いていてエラーを処理する方法がわからない場合は、エラーを上方に伝播させることができるため、例外処理は迅速にコーディングするのが簡単です (チェックされた例外を処理する必要がある Java を使用していないと仮定します)。 . 例外が発生した場所のスタック トレースを取得できるため (また、他の場所でキャッチされるはずだった問題をキャッチするためにトップ レベルの例外ハンドラーを構築できるため)、デバッグに適しています。正しいことを行っていれば、問題がより早く通知されるため、維持するのに適しています。

ただし、例外処理にはいくつかの設計上の問題があり、それを間違えるとさらに悪化します。要するに、例外の処理方法がわからないコードを書いている場合は、例外を伝播させる必要があります。例外を変換してから再スローするためだけにエラーをトラップするコーダーが多すぎるため、問題の元の原因に関する情報を失うスパゲッティ例外コードが発生することがあります。これは、トップ レベル (エントリ ポイント) に例外ハンドラがあることを前提としています。

于 2008-11-21T03:33:25.147 に答える
0

個人的には、それが純粋な「C」である場合、Base struct に errno を追加します。これが C++ の場合、例外をスローします。

これらのエラーがどれほど「致命的」であるかによって異なります。ユーザーは本当にエラーを表示する必要がありますか?それとも、他の開発者を教育するためですか?

保守性のために、発生する可能性のあるエラーを明確に文書化し、エラー処理の明確な例を含める必要があります。

于 2008-11-21T03:58:02.647 に答える
0

個人的には出力グラフィックに関してはサイレントフェイルでいいと思っています。それはあなたのイメージを悪くするだけです。

とにかく、グラフィックエラーは非常に簡単に見つけられます。

于 2008-11-21T01:05:13.387 に答える