Notre société fournit un composant réseau (DLL) pour une application GUI.Pourquoi cette exception SocketException n'est-elle pas interceptée par une routine de capture générique?
Il utilise une minuterie qui vérifie les déconnexions. Si elle veut se reconnecter, il appelle:
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();
}
// ...
}
}
Le problème est, à l'intérieur de la routine DoConnect() SocketException est jeté (et non pris). Je suppose que le catch (Exception e) devrait attraper TOUTES les exceptions mais de façon ou d'autre le SocketException n'a pas été attrapé et montre à l'application de 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)
}
Le doc a confirmé que SocketException étend l'exception. Le stacktrace qui est apparu:
TcpClient.Connect() -> DoConnect() -> timClock_TimerCallback
Ainsi, l'exception n'est pas jeté à l'extérieur du bloc try/catch.
Des idées pour lesquelles cela ne fonctionne pas?
Ce problème se produit uniquement lorsqu'un débogueur est attaché ou toujours lorsque le code est en cours d'exécution? Capture est également garanti pour attraper toutes les exceptions dans le bloc try - mais si votre DoConnect exécute un feu et oublie que les sources de l'exception, DoConnect retournera et le traitement continuera à causer l'exception d'être gérée par votre gestionnaire prévu. – cfeduke