Funciones Error, IfError, IsError e IsBlankOrError

Se aplica a: Aplicaciones de Canvas Dataverse Columnas de fórmulas Flujos de Escritorio Aplicaciones basadas en modelos Power Pages Power Platform CLI

Detectan errores y proporcionan un valor alternativo o llevan a cabo una acción. Crean un error personalizado o pasan un error.

Nota

Si una aplicación ha deshabilitado la función de Gestión de errores a nivel de fórmula en Configuración>Actualizaciones>Retiradas, esas funciones no funcionarán correctamente.

IfError

La función IfError prueba valores hasta que encuentra un error. Si la función descubre un error, la función evalúa y devuelve un valor de reemplazo correspondiente y detiene la evaluación adicional. También se puede proporcionar un valor predeterminado para cuando no se encuentran errores. La estructura de IfError se asemeja a la de la función If: IfError prueba errores, mientras que If prueba valores true.

Utilice IfError para reemplazar un error con un valor válido para que los cálculos posteriores puedan continuar. Por ejemplo, use esta función si la entrada del usuario puede resultar en una división por cero:

IfError( 1/x, 0 )

Esta fórmula devuelve 0 si el valor de x es cero, ya que 1/x produce un error. Si x no es cero, entonces se devuelve 1/x.

Detener el procesamiento posterior

Cuando se encadenan fórmulas en fórmulas de comportamiento, como:

Patch( DS1, ... );
Patch( DS2, ... )

La segunda función Patch para DS2 se intentará incluso si Patch en DS1 genera un error. El alcance de un error está limitado a cada fórmula que está encadenada.

Utilice IfError para realizar una acción y solo continuar procesando si la acción es correcta. Aplicación de IfError en este ejemplo:

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" ),
    Patch( DS2, ... ), Notify( "problem in the second action" )
)

Si Patch de DS1 tiene un problema, se ejecuta el primer Notify. No se produce más procesamiento, incluido el segundo Patch de DS2. Si el primer Patch es correcto, se ejecuta el segundo Patch.

Si se suministra, se devuelve el argumento opcional DefaultResult si no se descubren errores. Sin este argumento, se devuelve el último argumento Value.

Partiendo del último ejemplo, el valor de retorno de IfError se puede verificar para determinar si hubo algún problema:

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" );  false,
    Patch( DS2, ... ), Notify( "problem in the second action" ); false,
    true
)

Compatibilidad de tipos

IfError devuelve el valor de uno de sus argumentos. Los tipos de todos los valores que pueden ser devueltos por IfError debe ser compatible.

En el último ejemplo, Patch devuelve un registro que no es compatible con los valores booleanos utilizados para las fórmulas de Reemplazo o el Resultado predeterminado. Lo cual está bien, ya que no hay una situación en la que IfError devolviese el valor de retorno de estas llamadas a Patch.

Nota

Mientras el comportamiento está en proceso de cambio, los tipos de todos los argumentos para IfError deben ser compatibles.

En el ejemplo simple descrito anteriormente:

IfError( 1/x, 0 )

Los tipos de 1/x y 0 eran compatibles ya que ambos eran números. Si no es así, se fuerza el segundo argumento para que coincida con el tipo del primer argumento.

Excel muestra #DIV/0! cuando se produce una división por cero.

Considere IfError con lo siguiente en su lugar:

IfError( 1/x, "#DIV/0!" )

La fórmula anterior no funcionará. La cadena de texto "#DIV/0!" se convierte al tipo del primer argumento de IfError, que es un número. El resultado de IfError es otro error ya que la cadena de texto no puede ser forzada. Como solución, convierta el primer argumento en una cadena de texto para que IfError siempre devuelva una cadena de texto:

IfError( Text( 1/x ), "#DIV/0!" )

Como se ve arriba, IfError puede devolver un error si Replacement o DefaultResult generan un error.

FirstError / AllErrors

Dentro de las fórmulas de reemplazo, la información sobre los errores encontrados está disponible a través del registro FirstError y la tabla AllErrors. AllErrors es una tabla de registros de información de errores donde FirstError es un acceso directo al primer registro de esta tabla. FirstError siempre devuelve el mismo valor que First( AllErrors ).

Los registros de error incluyen:

Campo Tipo Descripción
Amable Enumeración ErrorKind (número) Categoría del error.
Mensaje Cadena de texto Mensaje sobre el error, adecuado para mostrar al usuario final.
Fuente Cadena de texto Ubicación en donde se originó el error, utilizada para informar. Por ejemplo, para una fórmula vinculada a una propiedad de control, este valor tiene el formato ControlName.PropertyName.
Observado Cadena de texto Ubicación en la que se muestra el error al usuario, utilizada para informar. Por ejemplo, para una fórmula vinculada a una propiedad de control, este valor tiene el formato ControlName.PropertyName.
Detalles Grabar Detalles sobre el error. Actualmente, solo se proporcionan detalles de errores de red. Este registro incluye HttpStatusCode, que contiene el código de estado HTTP y HttpResponse, que contiene el cuerpo de la respuesta del conector o servicio.

Por ejemplo, considere la siguiente fórmula como propiedad OnSelect de un control Button:

Set( a, 1/0 )

Y esta formula en la propiedad OnSelect de un segundo control Button:

IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )

La fórmula de ejemplo anterior mostraría el siguiente banner cuando se activan dos botones en una secuencia:

Control Button activado, que muestra una notificación de la función Notify.

Por lo general, solo habrá un error con el que FirstError pueda trabajar de manera adecuada. Sin embargo, hay escenarios en los que se pueden devolver varios errores. Por ejemplo, al usar un operador de encadenamiento de fórmulas o la función Concurrent. Incluso en estas situaciones, el informe FirstError podría ser suficiente para revelar un problema en lugar de sobrecargar a un usuario con múltiples errores. Si todavía tiene el requisito de trabajar con cada error individualmente, puede usar la tabla AllErrors.

IsError

La función IsError prueba un valor de error.

El valor devuelto es un valor booleano true o false.

El uso de IsError evita cualquier procesamiento posterior del error.

IsBlankOrError

La función IsBlankOrError prueba un valor en blanco o un valor de error y es equivalente a Or( IsBlank( X ), IsError( X ) ).

Al habilitar el control de errores para las aplicaciones existentes, considere reemplazar IsBlank con IsBlankOrError para mantener el comportamiento existente de las aplicaciones. Antes de la incorporación del manejo de errores, se utilizaba un valor en blanco para representar valores nulos de bases de datos y valores de error. El manejo de errores separa estas dos interpretaciones de blanco que podría cambiar el comportamiento de las aplicaciones existentes que continúan utilizándose Está en blanco.

El valor devuelto es un valor booleano true o false.

El uso de IsBlankOrError evita cualquier procesamiento posterior del error.

Use la función Error para crear y reportar un error personalizado. Por ejemplo, puede tener lógica para determinar si un valor dado es válido para su contexto o noalgo no comprobado para un problema automáticamente. Puede crear y devolver su propio error, completo con Clase y Mensaje, utilizando el mismo registro descrito anteriormente para la función IfError.

En el contexto de IfError, use la función Error para volver a lanzar o pasar por un error. Por ejemplo, su lógica en IfError puede decidir que en algunos casos un error puede ignorarse con seguridad, pero en otros casos es importante enviar el error. Dentro de IfError o App.OnError, use Error (FirstError) para pasar por un error.

A la función Error también se le puede pasar una tabla de errores, como se encontraría en la tabla AllErrors. Use Error (AllErrors) para volver a lanzar todos los errores y no solo el primero.

Un registro en blanco o tabla vacía pasada a Error no genera ningún error.

Sintaxis

Error( ErrorRegistro )
Error( Tabla de errores )

  • ErrorRecord – Obligatorio. Registro de información de error, incluyendo Clase, Mensaje, y otros campos. Se requiere tipo . FirstError se puede pasar directamente.
  • ErrorTable – Obligatorio. Tabla de registros de información de errores. AllErrors se pueden pasar directamente.

IfError( Valor1, Reemplazo1 [, Valor2 , Reemplazo2, ... [, Resultado predeterminado ] ] )

  • Valores – Obligatorio. Fórmulas para probar si hay un valor de error.
  • Reemplazos – Requeridos. Las fórmulas que se deben evaluar y los valores que se deben devolver si los argumentos de Value coincidentes devuelven un error.
  • DefaultResult – Opcional. Las fórmulas para evaluar si la fórmula no encuentra ningún error.

IsError( Valor )
IsBlankOrError( Valor )

  • Valor – Obligatorio. Fórmula que se probará.

Ejemplos

Simple IfError

Fórmula Descripción Resultado
SiError( 1, 2 ) El primer argumento no es un error. La función no tiene otros errores para verificar y ningún valor de retorno predeterminado. La función devuelve el último argumento de value evaluado. 1
SiError( 1/0, 2 ) El primer argumento devuelve un valor de error (debido a la división por cero). La función evalúa el segundo argumento y lo devuelve como resultado. 2
SiError( 10, 20, 30 ) El primer argumento no es un error. La función no tiene otros errores para verificar pero tiene un valor de retorno predeterminado. La función devuelve el argumento DefaultResult. 30
SiError( 10, 11, 20, 21, 300 ) El primer argumento 10 no es un error, por lo que la función no evalúa el reemplazo correspondiente de ese argumento 11. El tercer argumento 20 no es un error tampoco, por lo que la función no evalúa el reemplazo correspondiente de ese argumento 21. El quinto argumento 300 no tiene reemplazo correspondiente y es el resultado predeterminado. La función devuelve ese resultado porque la fórmula no contiene errores. 300
IfError( 1/0, Notify( "Hubo un problema interno" ) ) El primer argumento devuelve un valor de error (debido a la división por cero). La función evalúa el segundo argumento y muestra un mensaje al usuario. El valor devuelto de IfError es el valor devuelto de Notify, convertido al mismo tipo que el primer argumento de IfError (un número). 1

Simple IsError

Fórmula Descripción Resultado
IsError( 1 ) El argumento no es un error. FALSO
IsError(Blanco()) El argumento está en blanco, pero no es un error. FALSO
EsError( 1/0 ) El argumento es un error. verdadero
Si( IsError( 1/0 ), Notificar( "Hubo un problema interno" ) ) El primer argumento de IsError devuelve un valor de error (debido a la división por cero). Esta función devuelve true, que hace que If muestre un mensaje al usuario con la función Notify. El valor devuelto de If es el valor devuelto de Notify, convertido al mismo tipo que el primer argumento de If (un booleano). verdadero

Simple IsBlankOrError

Fórmula Descripción Resultado
IsBlankOrError( 1 ) El argumento no es un error ni está en blanco. FALSO
IsBlankOrError( En blanco () ) El argumento está en blanco. verdadero
IsBlankOrError( 1/0 ) El argumento es un error. verdadero

Error sencillo

En este ejemplo, las fechas se validan entre sí, lo que genera un error si hay algún problema.

If( StartDate > EndDate,
    Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )

En este ejemplo, se permite el paso de algunos errores mientras que otros se suprimen y se reemplazan por un valor. En el primer caso, b está en un estado de error porque la función Valor tiene un argumento no válido. Debido a que el escritor de la fórmula no lo esperaba, se transmite para que el usuario lo vea. En el segundo caso, con la misma fórmula, b tiene el valor 0, lo que resulta en una división por cero. En este caso, el escritor de fórmulas puede saber que esto es aceptable para esta lógica, suprimir el error (no se muestra ningún banner) y devolver -1 en su lugar.

With( {a: 1, b: Value("a")},
      IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns an error with Kind = ErrorKind.InvalidArgument

With( {a: 1, b: 0} )
      IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns -1

La tabla AllErrors se puede filtrar como cualquier otra tabla. Usada con la función Error, los errores esperados se pueden eliminar y los errores restantes se conservan y notifican. Por ejemplo, si supiéramos que la división por cero no va a ser un problema en un contexto particular, esos errores podrían filtrarse, dejando todos los demás errores intactos con la siguiente fórmula:

Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )

Paso a paso

  1. Agregue un control Text input y asígnele el nombre TextInput1, siempre que no sea su nombre predeterminado.

  2. Agregue un control Label y asígnele el nombre Label1, siempre que no sea su nombre predeterminado.

  3. Establezca la fórmula para la propiedad Text de Label1 en:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. En TextInput1, introduzca 1234.

    Label1 muestra el valor 1234 ya que es una entrada válida para la función Valor.

  5. En TextInput1, introduzca ToInfinity.

    Label1 muestra el valor -1 ya que esta no es una entrada válida para la función Valor. Si no se ajustara la función Value con IfError, la etiqueta no mostraría ningún valor, ya que el valor de error se trata como blank.

Vea también

Referencia de fórmula para Power Apps