Pregunta

Tengo el siguiente código en una clase mía. El propósito de esta clase es obtener el saldo de un servidor web. Sólo en caso de que algo salga mal con el equilibrio. Manejaré una excepción. Sin embargo, todo esto es fácil de hacer. Pero me pregunto qué debo devolver en mi declaración de captura.

La mayoría de los ejemplos que he visto solo escriben en la consola usando:

Console.WriteLine(ex.Message);

Eso está muy bien. Pero en una aplicación real, ¿qué hacen la mayoría de los desarrolladores?

 //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");
        }

Mi función en este momento devuelve void. Y me pregunto qué más devolvería si el cliente web está ocupado.

Muchas gracias por cualquier consejo,

¿Fue útil?

Solución

No capture una excepción si no puede manejarla. Si devuelve solo un valor, el método de llamada debe verificar si el valor es un resultado real o simplemente un indicador de una excepción. Y ahora este método debe decidir qué hacer y regresar. Y el método que llama a este método. Y el método ...

Así que simplemente deja que la excepción suba de nivel en la pila y cógela en algún lugar donde puedas manejarlo. Tal vez directamente debajo de la interfaz de usuario y luego muestre un cuadro de mensaje preguntando si el usuario quiere volver a intentar o mostrar información sobre cómo resolver el problema. Si no tiene una interfaz de usuario, encuéntrela en algún lugar donde pueda resolver el problema y vuelva a intentarlo. Si se trata de un problema temporal, vuelva a intentar la tarea completa a un nivel razonable hasta que la llamada se realice correctamente.

Si desea registrar algo, use el siguiente patrón para registrar la excepción y reenviarlo.

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

   throw;
}

Tenga en cuenta que es throw; y no throw exception; . Si hace lo siguiente, pierde el rastro original de la pila. Si puede inferir más detalles sobre la causa de la excepción, debe ajustar la excepción capturada en una excepción más significativa con información adicional.

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

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

   throw;
}

Otros consejos

Deberías usar el método ex.ToString ()

  

Excepción.Mensaje   contiene una descripción simple de la excepción (por ejemplo, " Referencia de objeto no establecida ... ").

     

Exception.ToString ()   contiene una descripción de la excepción junto con un seguimiento completo de la pila.

Mejores prácticas para el manejo de excepciones en .NET

¿Podría volver a ejecutar el método si el cliente está ocupado pero esperar un cierto tiempo antes de volver a intentarlo? Potencialmente con una falla después de x reintentos.

Si, por el contrario, desea continuar y simplemente registrar el problema, su declaración de captura podría registrar la excepción en un registro basado en archivos, un visor de eventos, enviar a una base de datos, generar una alerta (correo electrónico, sms, etc.) si es necesario.

Depende de la gravedad de la excepción.

Sugeriría buscar en El Bloque de excepciones de Patterns & amp; Prácticas

Si solo estás interesado en ver la excepción, deberías volver a lanzar la excepción para que quien esté planeando manejarla todavía la obtenga.

Ciertamente no desea enmascarar una excepción no controlada. Deja que eso burbujee a través de la pila. Pero si está preguntando qué devolver si el cliente web está ocupado, ¿qué tal devolviendo un intervalo aleatorio o algún intervalo significativo que la persona que llama la función debe esperar antes de intentar descargar el saldo nuevamente? Un número aleatorio podría distribuir la carga o mitigar un problema de colisión. Se podría enviar un intervalo más significativo en función del estado actual del servidor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top