La lectura de APIs y sitios webs se hace cada día más frecuente dado que cada vez más sitios y aplicaciones proveen la posibilidad de conectarnos a datos dentro de las plataformas.
Cierto es que leer e interpretarlos no siempre lo es todo. Un buen desarrollo en lenguajes de programación normalmente utilizar Try Catch para capturar e interpretar los errores que puedan surgir de requests que hagamos a un origen web.
Este artículo nos mostrará como capturar esos errores para poder accionar de distintas maneras
Hace tiempo hemos publicado en el blog un artículo de buena práctica al momento de utilizar la función Web.Contents a partir de un famosisimo post de Chris Webb. En el hablamos de RelativePath y Query. Lo cierto es que hay muchos más parámetros que podemos utilizar dentro de dicha función. Una de ellas nos permitirá dejar pasar los errores especificados para que podamos accionarlos luego. Me refiero a:
ManualStatusHandlingUrl: si se especifica este valor como una lista, se impedirá cualquier control integrado de las solicitudes HTTP cuya respuesta
Este parámetro recibe enteros o lista de enteros. Si esos valores se corresponden con errores http como por ejemplo 500 (Internal Server Error), el Web.Contents no fallaría y el resultado sería el response de la API (que normalmente es json) con el mensaje de error y otros valores configurados por el desarrollador. Veamos como quedaría
Source = Web.Contents("api.github.com",
[
RelativePath= "/repos/LaDataWeb/data-quality-report/commits",
ManualStatusHandling={404, 400}
]
)
Los errores especificados en la lista no devolverán DataSource.Error sino el response del error (evitas el corte por excepción).
Una vez que permitimos el paso del error buscado, en este ejemplo 404 y 400, debemos capturarlo porque puede que el formato de la respuesta no sea algo que los pasos siguientes de nuestro script puedan interpretar. No tendríamos los datos sino otros niveles en la respuesta.
Para capturar nuestro error vamos a nutrirnos de Value.Metadata(). Esta función devuelve un registro que contiene los metadatos de entrada. En la entrada podemos poner un paso anterior o una variable que tengamos. En nuestro caso vamos a colocar "Source".
GetMetadata = Value.Metadata(Source)
La respuesta que obtenemos de la función sería un registro que se ve así:

Como podemos ver la metadata tiene mucha información sobre un request. En nuestro caso nos interesa el valor de Reponse.Status que normalmente es 200 o 202 cuando es correcto pero si hay error suele cortar toda la ejecución. Por eso hicimos el paso anterior, porque ManualStatusHandling permitirá seguir la ejecución y obtener la metadata aún cuando falla. vamos a poder capturar gracias a que lo escribimos antes. Si intentamos modificar el RelativePath escribiendo lo que sea, no encontraría la dirección y llegaríamos a este resultado:

A partir de aqui podemos elegir como direcciónar nuestra solución. Por ejemplo:
Al final de la ejecución podríamos elegir devolver la misma estructura de tabla si todo estuviera correcto pero sin valores. Algo así:

De ese modo el código no fallaría y en nuestro front podríamos agregar una alerta al usuario con la técnica de superposición de mensajes en blanco que vimos en un post anterior. El usuario y los desarrolladores estarían al tanto de la situación. Bastaría con una medida que pregunte la suma de ALL filas es blanco. Esto podría ponerse más detallado si agregaramos una columna con el estado del error para poder expresar diversos mensajes. El ejemplo muestra 404 pero podríamos armar una gran lista con distinta condiciones segun el error.
Generar una tabla de mensajes y control de errores. Ademas de capturar el error y permitirle al script seguir, lo ideal sería llevar un control de los fallos que ocurrieron en esos requests. Es probable que nuestro origen no se constituya de un solo request a una API sino de muchos más en caso que sea iterativo. Entonces podríamos generar una tabla de las fallas para tener un mejor control y no frenar si tenemos una falla en medio de una fila.
Espero que esto los ayude a tener control de las acciones y errores cuando trabajamos con origenes web. Pueden copiar el código Power Query desde mi github.