0

C# Windows UI プログラムがありWindow1 : Window、そのコンストラクターで非同期ソケット サーバーを起動し、andwhile (true) { /* BeginAccept */ }を使用して接続する任意のクライアントにデータをストリーミングします。BeginSendEndSend

クライアントの 1 つが強制的に切断された場合Socket.EndSend、例外がスローされます (少し驚くべきことに、ObjectDisposedException代わりにSocketException、何でも)。

その例外により、プログラム全体が終了します (ウィンドウが閉じられます) が、スタック トレースは出力されません!

代わりに、私は罪のない人だけを手に入れます

A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll

出力パネルのメッセージ。

このように例外がサイレンシングされても、スタック トレースなしでプログラムがクラッシュする場合、例外がスローされた場所をどのように見つければよいでしょうか?

4

1 に答える 1

2

使用している .NET のバージョンによって異なります。しかし、それは一般的に文書化されていることです。

それが発生したくない場合は、スレッドのエントリ ポイントで最上位の例外ハンドラーを使用し、例外を "飲み込み" ます。つまり、ログに記録するか、スレッドを終了する前に実行したいことを行います。

のようなメソッドに関しては、 (またはさらに言えば) にBeginSend指定されたメソッドは、実質的にスレッドのエントリ ポイントです。例えばBeginSendBeginAccept

listener.BeginAcceptTcpClient(OnAccept, null);
//...

private static void OnAccept(IAsyncResult ar)
{
    try {
        var tcpClient = listener.EndAcceptTcpClient(ar);
        //...
    } catch(Exception ex)
    {
        Dump(ex);
        return;
    }
}
于 2012-09-11T21:14:26.057 に答える