【发布时间】:2012-01-02 02:13:23
【问题描述】:
通常,当附加调试器时,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 回调中抛出来重现该问题。)
【问题讨论】:
-
你附加到新线程了吗?
-
@Hogan:那是什么意思?我知道附加到一个进程,但是一个线程?
-
这仍然是个问题...我正在考虑提供赏金。有人热衷吗?
-
刚刚尝试了您的设置,但它仍在为我闯入调试器...
-
你能用选项->调试下的设置更新你的帖子吗?此外,您在 Debug->Exceptions 中检查了哪些(如果有)异常?
标签: c# .net visual-studio-2010 exception asyncsocket