ログアウトルーチン中にソケットエラーを処理する方法
質問
私はインスタントメッセージングライブラリを書いています。現在、ソケットへの読み取りまたは書き込み中にソケットエクセプションが提起されると、アプリケーション内からログアウトルーチンを開始し、ログアウトエベンタルグの引数としてソケットエクセプションをエンドゥーザーに渡します。これにより、エンドユーザーは、基礎となる例外が実際にレストなログアウトを引き起こしたものを確認する方法を提供します。
私の質問は、ログアウト関数へのユーザー呼び出し中に、ソケットが実際に例外をスローする場合、私は何をすべきかです。
例 - エンドユーザーはログアウト関数を呼び出し、ログアウト関数が既存のリクエストが優雅に終了するのを待っている間に、ソケットは読み取りスレッドに例外をスローします。
私はそれを見るように2つのオプションがあります -
エラーのふりは発生しなかったため、ログアウトの一部としてソケットが切断されたように動作します。
ソケットの例外が発生したら、ログアウトリクエストが行われているかどうかを確認し、もしそうなら、それを上書きします。その結果、元のログアウトリクエストが既にLoggedOutExceptionをスローするだけでなく、LogoutEventArgsの例外に合格する別のログアウトイベントを投げます。
また、わずかに関連している - サーバーが要求されていないシャットダウンを開始した場合は何をしますか(つまり、読み取りコールはnullを返します).. .NETメッセンジャーサーバーは、リクエストを送信するとこれを行う傾向があります好きではありません。これをそれ自体で例外として扱うことができますか?
私は、私のライブラリの一部を切断/ログアウトして、私の側の主要なとげであることがわかりました。私は頭を包むことができないようです。この状況を美しく処理するオープンソースコードアプリケーションを知っている人はいますか?
私は長い間頭の中でこのことに取り組むことを試みてきました、それは私を怒らせています。
解決
切断は本当に例外ではなく、予想されて対処する必要があるため、SocketExceptionをエンドユーザーに渡さないことにしました。代わりに、ログアウトが発生した理由を指定するLogoutEventargsにLogoutReasonプロパティがあります。
ログアウト中に切断が発生した場合、ログアウトはとにかく切断されるため、実際には例外ではないと判断しました。この場合、例外を単に無視します。