Compartir a través de


Gestión de errores

El comportamiento descrito en este artículo solo está disponible cuando la característica de administración de errores de nivel de fórmula está activada.

Power Fx admite el control de errores de nivel de fórmula. Esta característica está activada de forma predeterminada para todas las aplicaciones nuevas. Sin embargo, algunas aplicaciones anteriores podrían tenerla desactivada en la configuración de la aplicación. Mantenga activada esta característica.

  1. Abra la aplicación canvas en modo edición.
  2. Vaya a la pestaña ConfiguraciónActualizacionesRetirado.
  3. Asegúrese de que la administración a nivel de fórmula esté desactivada.

Para obtener más información, consulte Control de qué características están habilitadas.

Siempre hay errores: las redes se caen, el almacenamiento se llena y entran valores inesperados. Es importante que su lógica siga funcionando correctamente cuando hay problemas.

De forma predeterminada, los errores entran a través de las fórmulas de una aplicación y se notifican al usuario final de la aplicación. De este modo, el usuario final sabe que ha ocurrido algo inesperado. Pueden corregir el problema por sí mismos con una entrada diferente o pueden notificar el problema al propietario de la aplicación.

Como creador de aplicaciones, tome el control de los errores en la aplicación:

  • Detecte y controle un error. Si hay alguna posibilidad de que se produzca un error, escriba las fórmulas de la aplicación para detectar la condición de error y vuelva a intentar la operación. El usuario final no necesita preocuparse de que se haya producido un error, ya que el creador ha tenido en cuenta esa posibilidad. Capture el error mediante las funciones IfError, IsError e IsErrorOrBlank dentro de una fórmula.
  • Notificar un error. Si un error no se maneja en la fórmula en la que se produjo, este error se propaga hasta el controlador App.OnError. No se puede reemplazar el error porque ya se ha producido y forma parte de los cálculos de fórmulas. Sin embargo, puede usar App.OnError para controlar cómo se informa sobre el error al usuario final, lo que incluye suprimir por completo dicho informe. App.OnError también proporciona un punto de estrangulamiento común para los informes de errores en toda la aplicación.
  • Cree y vuelva a iniciar un error. Por último, puede detectar una condición de error con su propia lógica, una condición específica de la aplicación. Use la función Error para crear errores personalizados. Use la función Error para lanzar nuevamente un error después de interrogarse en IfError o App.OnError.

Cómo empezar

Vamos a empezar con un ejemplo sencillo.

  1. Cree una nueva pantalla en una aplicación Power Apps Canvas.
  2. Introduzca un control TextInput. El valor predeterminado es el nombre TextInput1.
  3. Introduzca un control Label.
  4. Establezca la propiedad Text de este control Label en la fórmula
1/Value( TextInput1.Text )

Captura de pantalla del banner de error que se muestra con "el valor no se puede convertir en un número" para el control de entrada de texto que contiene "Entrada de texto".

Verá un error porque el texto predeterminado de un control TextInput es , que no se puede convertir en un número. De forma predeterminada, esto es algo bueno: el usuario final recibe una notificación de que algo no funciona según lo esperado en la aplicación.

Obviamente, no quiere que se produzca un error para saludar al usuario cada vez que inicie esta aplicación. De todos modos, es probable que no sea el mejor valor predeterminado para el cuadro de entrada de texto. Para corregir este problema, cambie la propiedad Default del control TextInput a:

Blank()

Captura de pantalla del banner de error que se muestra con "división por cero".

Hmm, ahora ves un error diferente. Operaciones matemáticas con blanco, como la división, convierten el valor en blanco en cero. Ese valor provoca un error de división por cero. Para solucionar este problema, debe decidir cuál es el comportamiento adecuado para esta situación en esta aplicación. La respuesta podría ser mostrar en blanco cuando la entrada de texto está en blanco. Para lograr este objetivo, ajuste la fórmula con la función IfError :

IfError( 1/Value( TextInput1.Text ), Blank() )

Captura de pantalla en la que no se muestra ningún banner de error; un error debido a un valor en blanco ha sido reemplazado por un espacio en blanco.

Ahora el error se reemplaza por un valor válido y el banner de error desaparece. Sin embargo, es posible que se haya pasado, el IfError que utilizó cubre todos los errores, incluido ingresar un valor incorrecto, como . Para solucionar este problema, ajuste IfError para controlar solamente el caso de división por cero y vuelva a lanzar todos los demás errores.

IfError( 1/Value( TextInput1.Text ), 
         If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )

Captura de pantalla en la que no se muestra ningún banner de error; un error debido específicamente a una división por cero se sustituye por un espacio en blanco; de lo contrario, el error se relanza.

Por lo tanto, ejecute la aplicación y pruebe algunos valores diferentes.

Cuando no hay valores, como al iniciar la aplicación, no aparece ninguna respuesta, ya que el valor predeterminado es blank, pero tampoco aparece ningún error, ya que IfError reemplaza el error de división por cero.

Captura de pantalla en la que no se muestra ninguna respuesta y ningún banner de error.

Si escribe 4, obtendrá el resultado esperado de 0,25:

Captura de pantalla en la que se muestra la versión 0.25 y no se muestra ningún banner de error.

Y si escribe algo no válido, como , recibirá un banner de error:

Captura de pantalla que no muestra ningún valor y se muestra un banner de error debido a la imposibilidad de convertir "hello" en un número.

Este es un ejemplo inicial sencillo. Puede controlar los errores de muchas maneras diferentes, en función de las necesidades de la aplicación:

  1. En lugar de un banner de error, podría mostrar "#Error" en el control de etiqueta con la fórmula. Para mantener los tipos de reemplazos compatibles con el primer argumento de IfError, debe convertir explícitamente el resultado numérico en una cadena de texto mediante la función Text .
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Captura de pantalla que muestra ningún banner de error y, en su lugar, #Error se muestra como resultado.
  2. En lugar de encapsular esta instancia específica con IfError, podría escribir un controlador App.OnError centralizado. No se puede reemplazar la cadena que se muestra por "#Error" porque el error ya se ha producido y App.OnError solo se proporciona para controlar los informes.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Propagación de errores

Los errores fluyen a través de fórmulas tal y como ocurre en Excel. Por ejemplo, en Excel, si la celda tiene la fórmula , A1 muestra el valor de error :

Captura de pantalla de la hoja de cálculo de Excel con A1=1/0 y #DIV/0! que se muestra en la celda.

Si la celda hace referencia a con una fórmula como , el error también se propaga a través de esa fórmula:

Captura de pantalla de una hoja de cálculo de Excel que muestra A2=A1*2 y #DIV/0! en la celda.

El error reemplaza el valor que la fórmula calcularía de otro modo. En la celda no encontramos el resultado de la multiplicación, sino solo el error de la división en .

Power Fx funciona de la misma manera. En general, si proporciona un error como argumento para una función o operador, la operación no tiene lugar. El error de entrada se transmite y forma parte del resultado de la operación. Por ejemplo, devuelve un error División por cero, ya que el error más interno pasa a través de la función Text y la función Mid:

Captura de pantalla del banner de error que muestra una operación no válida: división por cero.

En general, los errores no se reflejan en las propiedades de control de Power Apps. Vamos a ampliar el ejemplo anterior con otro control que indique si la propiedad de la primera etiqueta está en estado de error.

Captura de pantalla que no muestra ningún error en el segundo control de etiqueta.

Es correcto que los errores no se propaguen a través de un control porque el sistema observa errores en la entrada de todas las propiedades de control. El error no se pierde.

La mayoría de las funciones y operadores siguen la regla "error en la entrada, error en la salida", pero hay algunas excepciones. Las funciones IsError, IsErrorOrBlank y IfError están diseñadas para trabajar con errores, por lo que es posible que no devuelvan un error incluso si se les pasa uno.

Cómo detectar los errores

Power Fx no observa errores hasta que la fórmula usa el valor de error.

Como resultado, es posible que las funciones If y Select no devuelvan un error si se pasa una. Pongamos como ejemplo la fórmula . Hay un error de división por cero presente en esta fórmula, pero dado que la función If no está tomando esa rama debido a la condición de false, Power Fx y Power Apps no notifican un error:

Captura de pantalla que muestra que no hay ningún banner de error con la función If en la propiedad de texto de la etiqueta.

El uso de la función Set con un error no notifica un error en el momento en que el error se coloca en la variable . Por ejemplo, en Power Apps, esta es una fórmula en App.OnStart que coloca un error de división por cero en la variable x:

Captura de pantalla que no muestra ningún banner de error con la llamada a la función Set en App.OnStart.

No se comunica ningún error porque no se hace referencia a . Sin embargo, en el momento en que agregas un control de etiqueta y estableces su propiedad Text a , se muestra el error.

Captura de pantalla que muestra el banner de error que se muestra con el control de etiqueta que hace referencia a la variable x.

Puede observar errores dentro de una fórmula mediante las funciones IfError, IsError e IsErrorOrBlank . Con estas funciones, puede devolver un valor alternativo, realizar una acción alternativa o modificar el error antes de que se observe y se notifique.

Cómo comunicar un error

Después de que Power Fx observe un error, el siguiente paso es notificar el error al usuario final.

A diferencia de Excel, no siempre hay un lugar conveniente para mostrar un resultado de error, ya que el resultado de una fórmula podría impulsar una propiedad como coordenadas X e Y de un control para el que no hay ningún lugar conveniente para mostrar algún texto. Cada host de Power Fx determina cómo aparecen los errores para el usuario final y cuánto control tiene el creador sobre este proceso. En Power Apps, se muestra un banner de error y se usa App.OnError para controlar cómo se notifica el error.

Es importante tener en cuenta que App.OnError no puede reemplazar el error tal y como lo hace IfError. En el momento en que se ejecuta App.OnError , el error ya se ha producido y el resultado se propaga a través de otras fórmulas. App.OnError solo controla cómo se informa el error al usuario final y proporciona un enlace para que el creador registre el error si lo desea.

Las variables de ámbito FirstError y AllErrors proporcionan información de contexto sobre los errores. Este contexto proporciona información sobre el tipo de error, donde se originó el error y dónde se observó.

Parada después de un error

Las fórmulas de comportamiento admiten la adopción de medidas, la modificación de bases de datos y el cambio de estados. Estas fórmulas permiten realizar más de una acción en una secuencia mediante el operador de encadenamiento (o dependiendo de la configuración regional).

En este caso, por ejemplo, el control de cuadrícula muestra lo que hay en la tabla. Cada selección de botón cambia el estado en esta tabla con dos llamadas Patch:

Captura de pantalla de animación que muestra los dos registros de la tabla T que se actualizan con números aleatorios después de cada clic de botón.

En una fórmula de comportamiento encadenado, las acciones no se detienen después del primer error. Vamos a modificar nuestro ejemplo para pasar un número de índice no válido en la primera llamada Patch. El segundo Patch continúa a pesar de este error anterior. El primer error se comunica al usuario final y aparece como un error en Studio en el control:

Captura de pantalla de animación que muestra solo el segundo registro de la tabla T que se actualiza con números aleatorios después de cada clic de botón, el primer registro produce un error.

Use IfError para detener la ejecución después de un error. De un modo similar a lo que ocurre con la función If, el tercer argumento de esta función proporciona un lugar para poner acciones que deben ejecutarse solo si no hay ningún error:

Captura de pantalla de la animación que no muestra ningún cambio en ninguno de los registros de la tabla T, ya que IfError impide que la segunda operación se complete después de un error.

Si se produce un error durante una de las iteraciones de ForAll, el resto de las iteraciones no se detiene. ForAll está diseñado para ejecutar cada iteración de forma independiente, lo que permite la ejecución paralela. Cuando se completa forAll , se devuelve un error, que contiene todos los errores detectados (examinando AllErrors en IfError o App.OnError).

Por ejemplo, la fórmula siguiente da como resultado que ForAll devuelva dos errores (para la división por cero para 0, dos veces) y tiene tres registros (para cuando no es 0): .

Clear( Collection ); 
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );

Trabajando con múltiples errores

Una fórmula de comportamiento puede ejecutar más de una acción, así que también puede encontrarse más de un error.

De forma predeterminada, la aplicación notifica el primer error al usuario final. En este ejemplo, ambas llamadas Patch fallan, y la segunda llamada falla con un error de división por cero. El usuario ve solo el primer error sobre el índice:

Captura de pantalla del primer error de índice que se muestra en un banner de error; no se notifica el segundo error.

La función IfError y App.OnError pueden tener acceso a todos los errores detectados mediante la variable de ámbito AllErrors . En este caso, puede establecer esta variable en una variable global y examinar ambos errores detectados. En la tabla, aparecen en el mismo orden en el que se encontraron:

Captura de pantalla de la captura de los errores en la variable global PatchErrors, donde podemos ver que ambos errores están presentes.

Las fórmulas que no dependen del comportamiento también pueden devolver varios errores. Por ejemplo, el uso de la función Patch con un lote de registros para actualizar puede devolver varios errores, uno por cada registro que falla.

Errores en tablas

Como ha visto anteriormente, puede almacenar errores en variables. También puede incluir errores en estructuras de datos, como tablas. Este enfoque es importante porque garantiza que un error en cualquier registro no pueda invalidar toda la tabla.

Por ejemplo, considere este control de tabla de datos en Power Apps:

Captura de pantalla de la tabla de datos que muestra un error para el campo Recíproca para una entrada de 0, lo que da como resultado un error de división por cero.

El cálculo de AddColumns encontró un error de división por cero para uno de los valores. Para ese único registro, la columna Reciprocal tiene un valor de error (división por cero), pero los otros registros no lo tienen y están bien. devuelve falso y devuelve verdadero.

Si se produce un error al filtrar una tabla, todo el registro es un error. La operación todavía devuelve el registro en el resultado para que el usuario final sepa que algo estaba allí y hay un problema.

Vamos a ver este ejemplo. Aquí, la tabla original no tiene errores, pero el acto de filtrar crea un error cada vez que Value es igual a 0:

Captura de pantalla de la tabla de datos que muestra los errores de dos registros que no se pudieron procesar según los criterios de filtro.

Los valores -5 y -3 se filtran correctamente. Los valores 0 dan como resultado un error al procesar el filtro, por lo que no está claro si el registro debe incluirse o no en el resultado. Para maximizar la transparencia de los usuarios finales y ayudar a los creadores a depurar, la operación incluye un registro de error en lugar del original. En este caso, devuelve verdadero.

Errores de origen de datos

Las funciones que modifican el contenido de los orígenes de datos, como Patch, Collect, Remove, RemoveIf, Update, UpdateIf y SubmitForm informan de los errores de dos maneras:

  • Cada una de estas funciones devuelve un valor de error como resultado de la operación. Puede detectar errores mediante IsError y reemplazar o suprimir errores mediante IfError y App.OnError como de costumbre.
  • Después de la operación, la función Errors también devuelve los errores de las operaciones anteriores. Este comportamiento puede ser útil para mostrar el mensaje de error en una pantalla de formulario sin necesidad de capturar el error en una variable de estado.

Por ejemplo, esta fórmula comprueba si hay un error de Collect y muestra un mensaje de error personalizado:

IfError( Collect( Names, { Name: "duplicate" } ),
         Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )

La función Errors también devuelve información sobre errores pasados durante las operaciones de runtime. Esto puede ser útil para mostrar un error en una pantalla de formulario sin necesidad de capturarlo en una variable de estado.

Relanzamiento de errores

A veces espera posibles errores y puede omitirlos de forma segura. Dentro de IfError y App.OnError, si se detecta un error que se debe pasar al siguiente controlador de nivel superior, reemítalo mediante .

Cómo crear sus propios errores

También puede crear sus propios errores mediante la función Error .

Si crea sus propios errores, use valores superiores a 1000 para evitar posibles conflictos con valores de error del sistema futuros.

Valores de enumeración ErrorKind

Enumeración TipoDeError Valor Descripción
AnalysisError 18 Error del sistema. Hay un problema con el análisis del compilador.
CódigoDeIdiomaIncorrecto 14 Se utilizó un código de idioma no válido o no reconocido.
BadRegex 15 Expresión regular no válida. Compruebe la sintaxis utilizada con las funciones IsMatch, Match o MatchAll.
Conflicto 6 El registro que está actualizando ya se ha cambiado en el origen y debe resolver el conflicto. Una solución común es guardar los cambios locales, actualizar el registro y volver a aplicar los cambios.
Restricción Incumplida 8 El registro no pasó una verificación de restricción en el servidor.
CreatePermission 3 No tiene permiso para crear un registro para el origen de datos. Por ejemplo, se llamó a la función Collect.
EliminarPermisos 5 No tiene permiso para eliminar un registro del origen de datos. Por ejemplo, se ha llamado a la función Remove.
Div0 13 División por cero
EditarPermisos 4 No tiene permiso para crear un registro para el origen de datos. Por ejemplo, se ha llamado a la función Patch.
ValorGenerado 9 Un valor se pasó erróneamente al servidor para un campo que el servidor calcula automáticamente.
InvalidFunctionUsage 16 Uso no válido de una función. A menudo, uno o más de los argumentos de la función son incorrectos o se utilizan de forma no válida.
FileNotFound 17 No se ha podido encontrar el almacenamiento SaveData.
MemoriaInsuficiente 21 No hay suficiente memoria ni almacenamiento en el dispositivo para la operación.
ArgumentoInválido 25 Se ha pasado un argumento no válido a una función.
Interno 26 Error del sistema. Hay un problema interno con una de las funciones.
FaltaObligatorio 2 Falta un campo obligatorio de un registro.
Network 23 Hay un problema con las comunicaciones de red.
None 0 Error del sistema. No hay ningún error.
No aplicable 27 No hay valores disponibles. Este error es útil para diferenciar un valor en blanco que se puede tratar como cero en cálculos numéricos, de valores en blanco que se deben marcar como un posible problema si se usa el valor.
No encontrado 7 No se ha encontrado el registro. Por ejemplo, el registro que se debe modificar en la función Patch.
NoSoportado 20 Operación no admitida por este reproductor o dispositivo.
Numeric 24 Se ha usado una función numérica de manera incorrecta. Por ejemplo, Sqrt con -1.
CuotaExcedida 22 Cuota de almacenamiento superada.
ReadOnlyValue 10 La columna es de solo lectura y no se puede modificar.
Permiso de Lectura 19 No tiene permiso para leer los registros del origen de datos.
Sincronización 1 El origen de datos notificó un error. Consulte la columna Message para obtener más información.
Desconocido 12 Se ha producido un error, pero es de tipo desconocido.
Validación 11 El registro no ha superado una verificación de validación.