1

コンピューターのすべてのIPアドレスを取得したい。何かがうまくいかない場合(例外)、私は単に空の文字列を返したいだけです。これが私が使っている関数です。GetHostEntryいくつかの例外をスローし、GetHostNameまた例外をスローします。これらすべての例外をどのように処理する必要がありますか?それぞれを1つずつキャッチする必要がありますか?これにより、コードが乱雑になります。または、ブロック内で単に使用catch (Exception e)して何もしない必要がありますか?catchそれを処理するための最良の方法は何ですか?

  private string GetIpAddress()
    {
        var temp = new StringBuilder();
        try {
                var hostEntry = Dns.GetHostEntry(Dns.GetHostName());
                var ips = from address in hostEntry.AddressList
                      where (address.AddressFamily == AddressFamily.InterNetwork)
                      select address;

                foreach (IPAddress ip in ips) {
                     temp.Append(ip).Append(" ");
                }
        } catch (exception1) {

        } catch (exception2) {

        } .....

        return temp.ToString();
    }
4

5 に答える 5

4

特定の Exception をキャッチする必要があるのは、それについて何か役立つことができる場合だけです。それ以外の場合は、例外を何らかの有用な処理ができるレベルに伝播させます。

他の方法ではキャッチされない例外を適切に管理するグローバルな例外ハンドラーが必要です。

于 2013-02-12T22:22:42.703 に答える
1

あなたが何かできること、または特定の方法で処理したいものを処理します(ネットワークに接続しているかどうかを確認するメッセージボックスを駆動して接続に失敗したと考えてください)

他の「うまくいかなかった」例外については、それを処理することが意味のある場所まで伝播させるか、意味のあるコンテキスト例外を再スローして、適切な場所で処理します。

なんらかのプロセスのネットワークを介してログ ファイルにレポートを送信するだけの場合、その例外によってプロセスが強制終了されることは理にかなっていますか? そうではなく、最上位の呼び出しを SendNetworkReport にラップするだけです。

プロセス全体の中心である場合は、メインの制御コードまで伝播させ、状況的に重要な方法でプロセスを中止します。

于 2013-02-12T22:26:33.560 に答える
1

本当に例外を破棄したい場合は、空のcatch.

try
{
   // Code
}
catch {}

()(これは'sではなく、中かっこのペアであることに注意してください)

于 2013-02-12T22:22:58.770 に答える
0
  • 例外をミュートしないでください。少なくともログ行を書き込んでください。たとえあなたがそれが既知の理由で既知の種類の例外になるだろうと仮定しても。

  • 明らかな理由がないのに例外をキャッチしないでください-それをバブルさせてください

  • すべての外部エントリポイント(イベントハンドラー、スレッドなど)にtry / catchを配置してください。ボタンクリックハンドラーからバブルが発生すると、アプリがクラッシュします。別のスレッドのコード、または実行を強制された場合は同じスレッドでも同じことが起こります。その上(Windows.Forms.Control.Invoke(delegate)など)

  • 異なるハンドラーの数を最小限に抑え、実際に例外を異なる方法で処理している場合のみ

  • AppDomain.UnhandledExceptionにリスナーを追加し、これらもログに記録します

于 2013-02-12T22:30:39.793 に答える