2010-12-05 5 views
1

ich den folgenden Codetry/catch-Block ausfällt und Anwendung abstürzt

try { 
    clientService.sin_family = AF_INET; 
    clientService.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); //fails 
    clientService.sin_port = htons(port); 
    } 

catch (...) { return; } 

habe Wenn ich meinen Netzwerk-Adapter, meine Anwendung abstürzt deaktivieren. Sollen solche Fehler nicht gefangen werden?

Antwort

1

Es ist nur eine Vermutung, aber Sie haben wahrscheinlich nicht überprüft hostEntry nach gethostbyname zurückgegeben und Sie haben einen NULL-Zeiger. Überprüfen Sie, ob es null ist, bevor Sie es verwenden.

+0

Ja, das war das Problem. Jetzt behoben. – coolface

+1

@coolface - stellen Sie sicher, dass Ihr Code * alle * Sockets-API-Returncodes überprüft, oder Sie sind für eine lange und schmerzhafte paar Wochen. –

1

Wenn Sie VS nicht richtig einstellen, fängt es keine SEH-Ausnahmen wie Zugriffsverletzungen ein, obwohl es möglich ist, SEH-Ausnahmen in Catch-Blöcken (...) abzufangen. Es ist wahrscheinlich nur eine bessere Idee, das Problem nicht zu zeigen, SEH-Ausnahmen sind normalerweise ein Anzeichen dafür, dass Sie etwas ernsthaft falsch gemacht haben.

+0

In diesem Fall, wie kann ich überprüfen, ob ich keinen Netzwerkadapter aktiviert habe, so bekomme ich die SEH-Ausnahme nicht? – coolface

+0

+1 - Sie müssen dies tun, sowie sicherstellen, dass der Code nicht nur für C++ - Ausnahmen eingerichtet ist. –

+0

@coolface: Ich habe keine Ahnung. Fragen Sie MSDN. – Puppy

1

Es ist schwierig, eine feste Schlussfolgerung hier ohne mehr Code zu erreichen, aber ich kann mir vorstellen, dass hostEntry oder sein h_addr_list Feld ist NULL aufgrund des Netzwerks nicht verfügbar ist. Ihr Code behandelt nur C++ - Ausnahmen, und Sie müssen ihn auf handle structured exceptions (wie Zugriffsverletzung) erweitern, damit dies Ihren Erwartungen entspricht.

Vorzugsweise fixieren nur den Code, so dass es nicht ungültige Zeiger nach einem früheren Fehler verwenden nicht auf gethostbyaddret al (Sie sollten dies wahrscheinlich sowieso tun, unabhängig von irgendwelchen Ausnahmebehandlung Erweiterungen).

+0

Wenn 'h_addr_list' NULL ist, würde dies an dieser Stelle keine Probleme verursachen. – terminus

+0

@terminus - die Codezeile, die als fehlerhafte Dereferenzierung hervorgehoben wird, die in 'sin_addr' steht. –

+0

Oh, sorry, habe das nicht gesehen. – terminus

Verwandte Themen