2010-12-05 8 views
1

次のコードがあります。try/catchブロックが失敗し、アプリケーションがクラッシュする

try { 
    clientService.sin_family = AF_INET; 
    clientService.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); //fails 
    clientService.sin_port = htons(port); 
    } 

catch (...) { return; } 

ネットワークアダプターを無効にすると、アプリケーションがクラッシュします。そのような誤りは捕まえるべきではないか?

答えて

1

これは単なる推測ですが、gethostbynameが返された後にはおそらくhostEntryをチェックしておらず、NULLポインタがあります。使用する前にヌルであるかどうかを確認してください。

+0

はい、それが問題でした。今修正されました。 – coolface

+1

@coolface - あなたのコードが* all *ソケットAPIのリターンコードをチェックしていることを確認してください。 –

1

VS権限を設定しないと、アクセス違反のようなSEH例外をキャッチしませんが、catch(...)ブロックのSEH例外をキャッチするように設定できます。おそらく最初に問題を提示しないほうがいいでしょう。SEHの例外は通常、あなたが真剣に間違ったことをしたことを示す指標です。

+0

この場合、ネットワークアダプターが有効になっていないかどうかをチェックしてSEH例外が発生しないようにするにはどうすればよいですか? – coolface

+0

+1 - これを行うだけでなく、C++例外だけでなくコードが設定されていることを確認する必要があります。 –

+0

@coolface:わかりません。 MSDNにお尋ねください。 – Puppy

1

コードを追加しなくてもここで確かな結論に達するのは難しいですが、hostEntryまたはそのh_addr_listフィールドがネットワークが利用できないためにNULLであると想像します。あなたのコードはC++の例外を処理するだけなので、これを期待通りに実行するには、アクセス違反などのように、コードをhandle structured exceptionsに拡張する必要があります。それは上の以前のエラーの後に無効なポインタを使用しないように

好ましくは、単にコードを修正gethostbyaddr(あなたはおそらく関係なく、任意の例外処理の強化の、とにかくこれを行う必要があります)。

+0

'h_addr_list'がNULLの場合、この時点では問題は発生しません。 – terminus

+0

@terminus - 'sin_addr'を値とするエラーのあるデリファレンスとしてハイライト表示されるコード行です。 –

+0

ああ、申し訳ありませんが、それを見ませんでした。 – terminus

関連する問題