Наша компания предоставляет сетевой компонент (DLL) для приложения с графическим интерфейсом.
Используется таймер, который проверяет наличие отключений. Если он хочет восстановить соединение, он вызывает:
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 не был перехвачен и отображается в приложении с графическим интерфейсом.
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.
Есть идеи, почему это не работает?