Обычно, когда отладчик подключен, Visual Studio 2010 останавливается на необработанном исключении, даже если в диалоговом окне «Исключения» отсутствует метка для типа исключения в столбце «Брошенный».Ключевое слово здесь: unhandled; , указанный диалог относится только к обработанным исключениям.
Однако в следующем минимальном примере Visual Studio 2010 не останавливается на исключении для меня, даже если оно появляетсяв «Немедленном окне» как исключение первого шанса:
РЕДАКТИРОВАТЬ: Первый минимальный пример, который я разместил, был исправлен первым полученным ответом, но, к сожалению, следующий пример все еще демонстрирует проблему:
using System;
using System.Net.Sockets;
namespace SocketTest
{
class Program
{
static void Main(string[] args)
{
var listener = new TcpListener(8080);
listener.Start();
AsyncCallback accepter = null;
accepter = ar =>
{
var socket = listener.EndAcceptSocket(ar);
var buffer = new byte[65536];
AsyncCallback receiver = null;
receiver = ar2 =>
{
var bytesRead = socket.EndReceive(ar2);
throw new InvalidOperationException();
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, receiver, null);
};
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, receiver, null);
listener.BeginAcceptSocket(accepter, null);
};
listener.BeginAcceptSocket(accepter, null);
Console.WriteLine("Feel free to connect to port 8080 now.");
Console.ReadLine();
}
}
}
Если вы запустите это, подключитесь к нему, запустив telnet localhost 8080
, а затем введите любой символ в telnet, надеюсь, вы увидите то, что я вижу: программа просто прерывает работу в молчании.
Почему Visual Studio явно проглатывает это исключение?Могу ли я заставить его разрываться при исключении, как обычно?
(Интересно, что бросание внутри обратного вызова BeginAcceptSocket
действительно происходит, как и исключение в нормальном потоке, начинающемся с Thread.Start
. Я могутолько воспроизведите проблему, бросив внутрь обратный вызов BeginReceive
.