2016-04-25 3 views
2

Macht es immer Sinn, jede Ausnahme "nur um sicher zu gehen" zu erfassen? Zum Beispiel:Fängt (...) immer Sinn?

try 
{ 
    Socket_Listen(); 

    if(Return_Value == SOCKET_ERROR) 
    { 
     throw SOCKET_LISTEN_ERROR; 
    } 

    __LOG__ << "Listening..." << endl; 
} 

catch(EError_ID) 
{ 
    __LOG__; 
    Get_Last_Error_As_String(__FUNCTION__); 
} 

catch(...) 
{ 
    __LOG__ << "WARNING: An unknown error occurred." << endl; 
} 

Ich werfe einen Fehler ich selbst definiert haben (SOCKET_LISTEN_ERROR), die Teil eines größeren Enum ist, die mehrere Fehlerkennungen enthält. Ist es möglich, dass hier eine andere Ausnahme geworfen wird, außer der, die ich geworfen habe? Aus Gründen der Vollständigkeit, hier ist Socket_Listen():

void CTCPServer::Socket_Listen() 
{ 
    Return_Value = listen(Socket, 
          2); 
} 
+1

Ich denke, es ist besser zu wissen, dass einige Ausnahmen passieren können _ und nur sie fangen. Wenn eine andere Ausnahme auftritt, könnte dies möglicherweise bedeuten, dass ein Fehler in Ihrem Code vorliegt. Indem Sie mit 'catch (...)' fangen, werden Sie die Informationen über die Ausnahme los, was nicht gut ist. – ForceBru

+0

'Aus Gründen der Vollständigkeit" Machst du Witze? [So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). Es scheint, dass Sie alles, was Sie wissen, verwechselt haben: Ausnahmen, errno-ähnliche Variablen, Rückgabecodes. Wählen Sie eine Fehlerbehandlungsstrategie und bleiben Sie dabei. Manchmal Leute [Ausnahmen deaktivieren] (http://programmers.stackexchange.com/questions/113479/are-there-any-real-world-cases-for-c-without-exceptions) (es ist üblich, zum Beispiel in gamedev). – Drop

+0

Der einzige wirkliche gute Zweck, um alle Ausnahmen zu erfassen, besteht darin, an einem bestimmten Punkt etwas wirklich/wirklich/wirklich Unerwartetes zu protokollieren. Sie werfen dann ** die Ausnahme ** neu. –

Antwort

4

Im Gegenteil, es selten macht Sinn, jede Ausnahme zu fangen. Wenn Sie einen catch-Block (ohne erneutes Ausführen) beenden, teilen Sie dem umgebenden Code mit, dass die Ausnahme behoben wurde und das Programm normal weiterlaufen kann.

Wenn Sie alle Ausnahmen ohne Wissen von dem, was sie sind, abfangen, können Sie möglicherweise nicht behaupten, dass alles normal ist. Es ist besser, ignorieren unerwartete Ausnahmen als sie zu verschlucken. Lassen Sie den Anrufer sich darum kümmern (möglicherweise, indem er sie zum Anrufer des Anrufers weiterleitet usw.).

Sie fragen, ob es weitere Ausnahmen gibt, die von diesem Code ausgelöst werden könnten. Ich weiß es nicht, und du auch nicht, also macht es keinen Sinn, sie zu fangen. Wenn beim Testen andere Arten von Ausnahmen gefunden werden und dieser Ort der richtige Ort ist, um sie zu behandeln, fügen Sie Code hinzu, um sie dort zu behandeln. Bis Sie jedoch wissen, was zu erwarten ist, entfernen Sie den Catch-All-Exception-Handler.

+0

Danke. Ihre Ausdehnung war sehr einfach zu verstehen. – YokeM