Ho trovato questa domanda Restituisci valore magico, genera eccezioni o restituisci falso in caso di fallimento? , tuttavia è abbastanza ampio. Vorrei una risposta più specifica.
Dire che ho un metodo chiamato Connect () che si connette a un dispositivo remoto su un socket Ethernet. Se il socket fallisce, genera SocketException.
Quindi il modo in cui lo vedo ho 2 opzioni valide.
Opzione 1: Cattura l'eccezione e restituisce true.
public void CallConnect()
{
while(!Connect())
{
//** Log error
}
//** do what ever
}
public bool Connect()
{
try
{
_socket.Connect()
return true;
}
catch(SocketException)
{
return false;
}
catch(<SomeOtherException1>)
{
return false;
}
catch(<SomeOtherException2>)
{
return false;
}
}
Opzione 2: Throw Generic Exception
public void Connect()
{
try
{
_socket.Connect()
}
catch(SocketException ex)
{
throw new ConnectionException("Blah blah I failed 1", ex);
}
catch(<SomeOtherException1>)
{
throw new ConnectionException("Blah blah I failed 2", ex);
}
catch(<SomeOtherException2>)
{
throw new ConnectionException("Blah blah I failed 3", ex);
}
}
public void CallConnect()
{
bool connected == false;
while(!connected)
{
try
{
Connect();
connected = true;
}
catch(ConnectionException)
{
//** Log error
}
}
}
Se capisco che un errore è un comportamento normale o previsto, non deve essere generata alcuna eccezione, ma se l'errore non dovrebbe mai accadere allora sì dovrebbe essere lanciata un'eccezione.
La mancata connessione potrebbe essere considerata un comportamento previsto se per consentire a qualcuno di scollegare il cavo Ethernet, o se qualcuno spegne il dispositivo con cui ha bisogno di comunicare, ma potrebbe anche essere considerato un comportamento eccezionale.
Ora se dovessi chiedere come dovrebbe gestirlo se l'invio fallisce dopo che mi sono connesso con successo, penso che la risposta sia ovviamente un'eccezione.