3

数週間前に例外の使用を開始しましたが、警告をスローする方法があるかどうか疑問に思っています。キャッチされない場合、この警告によってアプリケーションが強制的に終了されることはありません。どのような状況でそれを使用したいかの例を挙げます。

プロパティを一意の ID に追加するシステムがあります。まだ存在しないIDにプロパティを追加しようとすると、システムはそのIDを内部で作成し、後でプロパティを追加して結果を返す必要があります。もちろん、これは静かに行うことはできません。しかし、アプリケーションは実行し続けることができるので、例外をスローしたくありません。

何かが正しくないことを通知するにはどうすればよいですか? システムは実行されていますか?

4

4 に答える 4

4

誰に通知しますか? エンドユーザー?その場合は、適切なメッセージを に書き込んでくださいcerr。または、制御された方法で実行するラッパー関数 (例: LOG_WARNING()) を記述します。または、ロギング フレームワークを使用することをお勧めします。


しかし、アプリケーションは実行し続けることができるので、例外をスローしたくありません。

例外によってアプリケーションが終了する必要はないことに注意してください。スタックの上位で例外をキャッチし、状況を適切に処理できます。

于 2013-03-16T12:22:20.210 に答える
1

警告をスローすることはありませんが。あなたが探している機能は、errno

任意の標準エラーに設定することも、独自のエラー コードを作成することもできます。(ただし、それらを十分に文書化してください。)

これは、ライブラリが他の開発者によって使用されることを意図している場合に役立ちます。これが役立つ場合の例は、JSON パーサーを使用する場合です。JSON は、任意の精度で任意の大きな数値をサポートします。したがって、パーサーが表現できない数値に遭遇した場合に数値を表現するために内部的に double を使用する場合、その数値をセットerrno=EDOM;(範囲外の引数) で最も近い表現可能な数値に丸めることができます。丸めが重要かどうかは、開発者に確認してください。とても親切にしたい場合は、元のテキストを使用して、ラウンドの場所を取得する方法を追加することもできます。

とはいえ、これは次のような状況でのみ使用する必要があります。

  • 一部のシナリオでは、警告を完全に回避できます
  • 警告のルート ソースは、作成中のライブラリへの入力です。
  • 状況によっては、ライブラリの消費者が警告を気にするかもしれませんが、ほとんどの場合は気にしません。
  • 情報を返すためのより適切な方法はありません (ステータスを必要としないオーバーロードを使用して参照によって渡されるステータスなど)
于 2015-07-17T23:20:25.163 に答える
1

いいえ、それは不可能です。例外をスローしてキャッチすることしかできません。あなたが生意気になりたいなら、あなたはすることができます

class warning : public std::exception
{
public:
     warning(const std::string& msg) {}
     const char* what() { return msg.c_str(); } //message of warning
private:
     std::string msg;
};

次に、次のことができます。

throw warning("this is a warning");

必要に応じて、これは人工的に作成された警告システムになる可能性があります。

于 2013-03-16T12:22:54.433 に答える
0

stderr またはログにメッセージを出力するだけです。

于 2013-03-16T12:21:26.667 に答える