El problema con este simple enfoque es que si la llamada a Connect() falló, eso significa que el servicio no se conectó – y no podemos obtener el precio, que es lo siguiente que intentamos hacer:
1var updatedPrice = priceClient.GetPrice();
csharp

Así que, parece que necesitamos mover esa línea dentro del bloque de prueba también:
123456789101112131415161718publicstaticdecimalGetCurrentPrice(){var priceClient =newPriceClient();try{ priceClient.Connect();var updatedPrice = priceClient.GetPrice();}catch{}return updatedPrice;}
csharp
Hasta ahora todo bien. Pero cuando intentamos compilar esto, recibimos el siguiente error:
El nombre «updatedPrice» no existe en el contexto actual.
Porque estamos declarando actualizado el precio dentro del bloque de prueba…
1var updatedPrice = priceClient.GetPrice();
csharp
-no está disponible en el ámbito exterior. Tendríamos el mismo problema si tratáramos de devolver el precio dentro del bloque de captura. Aquí hay un punto clave:
Las variables declaradas dentro de un bloque de prueba o captura son locales al alcance del bloque.
Este es el problema que debemos resolver: resolver exactamente cómo queremos que funcione el alcance de la variable Precio actualizado. También nos da un empujón para considerar exactamente qué es lo que queremos que ocurra cuando la llamada falle y cómo queremos representar ese hecho al resto del sistema. La forma por defecto es con lo que empezamos, simplemente lanzando una excepción por la pila y causando que la aplicación falle – eso es no lo que queremos.
Una forma de manejar esto es representando un intento fallido de actualizar el precio como un resultado nulo. Nuestro método está actualmente devolviendo un tipo de decimal – el decimal es un tipo de valor, por lo que no es inherentemente nulo. Para hacerlo nulo, añadimos un signo de interrogación:
1publicstaticdecimal?GetCurrentPrice()
csharp
Esto significa esencialmente, «esta función devolverá un decimal, o puede ser nula». Así que, en un lenguaje sencillo, o pseudo-código como se llama, nuestra función funciona así:
- Crear un objeto cliente.
- Intenta conectarte al servicio.
- Si ese intento fracasa, deténgase y vuelva nulo.
- Si tiene éxito, consigue el precio y devuélvelo.
Moveremos todo nuestro camino feliz, donde todo va como esperábamos, dentro del bloque de prueba, y moveremos nuestro camino infeliz, lo que pasa si algo sale mal, dentro del bloque de captura:
1234567891011121314151617publicstaticdecimal?GetCurrentPrice(){var priceClient =newPriceClient();try{ priceClient.Connect();var updatedPrice = priceClient.GetPrice();return updatedPrice;}catch{returnnull;}}
csharp
Ahora nuestra llamada GetCurrentPrice nunca se bloqueará, siempre y cuando el código fuera del bloque de prueba , la llamada para crear el objeto priceClient, no arroje ninguna excepción.