我公司为GUI应用程序提供网络组件(DLL)。为什么这个SocketException未被泛型catch例程捕获?
它使用定时器来检查断开连接。如果要重新连接,它要求:
internal void timClock_TimerCallback(object state)
{
lock (someLock)
{
// ...
try
{
DoConnect();
}
catch (Exception e)
{
// Log e.Message omitted
// Raise event with e as parameter
ErrorEvent(this, new ErrorEventArgs(e));
DoDisconnect();
}
// ...
}
}
所以,问题是,在DoConnect()例程SocketException抛出(而不是抓)的内部。我会假设catch(Exception e)应该捕获所有的异常,但是不知何故SocketException并没有被捕获并且显示给GUI应用程序。
protected void DoConnect()
{
//
client = new TcpClient();
client.NoDelay = true;
// In the following call the SocketException is thrown
client.Connect(endPoint.Address.ToString(), endPoint.Port);
// ... (login stuff)
}
该文档证实SocketException扩展了Exception。 是出现了堆栈跟踪是:
TcpClient.Connect() -> DoConnect() -> timClock_TimerCallback
所以没有抛出异常的try/catch块之外。
任何想法,为什么它不工作?
只有在连接了调试器或始终运行代码时才会出现此问题吗?此外catch还可以捕获try块中的所有异常 - 但是如果您的DoConnect执行了一次fire并忘记了该异常,则DoConnect将返回并且处理将继续导致异常被您的预期处理程序取消处理。 – cfeduke 2010-02-08 15:42:13