Domanda

Ho il seguente codice in una mia classe. Lo scopo di questa classe è ottenere l'equilibrio da un server web. Nel caso in cui qualcosa vada storto nell'ottenere l'equilibrio. Tratterò un'eccezione. Tuttavia, tutto questo è facile da fare. Ma mi chiedo cosa devo restituire nella mia dichiarazione di cattura.

La maggior parte degli esempi che ho visto è sufficiente scrivere sulla console usando:

Console.WriteLine(ex.Message);

Va ??benissimo. Ma in una vera applicazione cosa fanno la maggior parte degli sviluppatori?

 //Download only when the webclient is not busy.
        if (!wc.IsBusy)
        { 
            // Sleep for 1/2 second to give the server time to update the balance.
            System.Threading.Thread.Sleep(500);

            try
            {
                // Download the current balance.
                wc.DownloadStringAsync(new Uri(strURL));
            }
            catch (WebException ex)
            {
                Console.Write("GetBalance(): " + ex.Message);
            }
        }
        else
        {
            Console.Write("Busy please try again");
        }

La mia funzione al momento ritorna nulla. E mi chiedo solo cos'altro vorrei restituire se il client web fosse occupato?

Mille grazie per qualsiasi consiglio

È stato utile?

Soluzione

Non catturare un'eccezione se non puoi gestirla. Se restituisci solo un valore, il metodo di chiamata deve verificare se il valore è un risultato reale o solo un indicatore di un'eccezione. E ora questo metodo deve decidere cosa fare e tornare. E il metodo che chiama questo metodo. E il metodo ...

Quindi, lascia che l'eccezione riempia lo stack e catturalo da qualche parte dove puoi gestirlo. Forse direttamente sotto l'interfaccia utente e quindi visualizzare una finestra di messaggio che chiede se l'utente desidera riprovare o visualizzare informazioni su come risolvere il problema. Se non si dispone di un'interfaccia utente, prenderla da qualche parte dove è possibile risolvere il problema e riprovare. Se si tratta di un problema temporaneo, riprovare l'intera attività a un livello ragionevole fino a quando la chiamata ha esito positivo.

Se si desidera registrare qualcosa, utilizzare il modello seguente per registrare l'eccezione e riprovarla.

try
{
   DoStuff();
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

Nota che è lanciare; e non lanciare un'eccezione; . Se lo fai in seguito, perdi la traccia dello stack originale. Se puoi dedurre maggiori dettagli sulla causa dell'eccezione, dovresti includere l'eccezione rilevata in un'eccezione più significativa con informazioni aggiuntive.

try
{
   DoStuff();
}
catch (SpecificMeaninglessException exception)
{
   Log(exception.ToString());

   throw new MeaningfulException("Details about the error.", exception);
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

Altri suggerimenti

Dovresti usare il metodo ex.ToString ()

  

Exception.Message   contiene una semplice descrizione dell'eccezione (ad es. " Riferimento oggetto non impostato ... ").

     

Exception.ToString ()   contiene una descrizione dell'eccezione insieme a una traccia dello stack completa.

Best practice per la gestione delle eccezioni in .NET

È possibile rieseguire il metodo se il client è occupato ma attendere un certo tempo prima di riprovare? Potenzialmente con un errore dopo i tentativi di x.

Se invece desideri proseguire e registrare semplicemente il problema, la tua dichiarazione catch potrebbe registrare l'eccezione in un registro basato su file, nel visualizzatore di eventi, inviare a un database, generare un avviso (e-mail, sms ecc.) se è necessario.

Dipende dalla gravità dell'eccezione.

Suggerirei di esaminare The Exception Block from Patterns & amp; Pratiche

Se sei interessato solo a visualizzare l'eccezione, dovresti rigettare l'eccezione in modo che chiunque abbia intenzione di gestirla, la riceverà comunque.

Certamente non vuoi mascherare un'eccezione non gestita. Lascia che si riempia di bolle attraverso la pila. Ma se stai chiedendo cosa restituire se il client Web è occupato, che ne dici restituendo un intervallo casuale o un intervallo significativo che il chiamante deve attendere prima di tentare di scaricare nuovamente il saldo? Un numero casuale potrebbe distribuire il carico o mitigare in altro modo un problema di collisione. Un intervallo più significativo potrebbe essere rispedito in base allo stato corrente del server.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top