通常情况下,当调试器附加时,即使异常对话框中的“抛出”列没有勾选异常类型,Visual Studio 2010也会在未处理异常处停止。关键字是未处理,上述对话框仅涉及已处理异常。
然而,在以下最小化的示例中,尽管它在立即窗口中作为第一次机会异常出现,但 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
回调中抛出异常来复现此问题。)