Funciones Error, IfError, IsError e IsBlankOrError

Se aplica a: Aplicaciones de lienzo Columnas de fórmulas de Dataverse Flujos de escritorio Aplicaciones basadas en modelos 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

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 producirá 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 devolverá 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 devolverá un registro que no es compatible con los booleanos utilizados para las fórmulas Replacement o DefaultResult. 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 lo son, el segundo argumento será forzado a coincidir con el tipo del primer argumento.

Excel mostrará #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!" será forzada al tipo del primer argumento para IfError, que es un número. El resultado de IfError todavía será otro error, ya que la cadena de texto no se puede forzar. 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 con FirstError siendo un acceso directo al primer registro de esta tabla. FirstError siempre devolverá el mismo valor que First( AllErrors ).

Los registros de error incluyen:

Campo Tipo Descripción
Variante Enumeración ErrorKind (número) Categoría del error.
Mensaje Cadena de texto Mensaje sobre el error, adecuado para mostrar al usuario final.
Código 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, tendrá la forma 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, tendrá la forma ControlName.PropertyName.
Detalles Registro Detalles sobre el error. En la actualidad, los detalles se proporcionan solo para 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 puede trabajar FirstError. 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.

Al usar IsError evitará 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 agregar el manejo de errores, un valor blanco se utilizó para representar tanto valores nulos de bases de datos como 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.

Utilizando IsBlankOrError evitará 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( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord (obligatorio). Registro de información de error, incluyendo Clase, Mensaje, y otros campos. Variante es obligatorio. FirstError se puede pasar directamente.
  • ErrorTable - Obligatorio. Tabla de registros de información de errores. AllErrors se puede pasar directamente.

IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )

  • Value(s): requerido. Fórmulas para probar si hay un valor de error.
  • Replacement(s): requerido. 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( Value )
IsBlankOrError( Valor )

  • Value (obligatorio). Fórmula que se probará.

Ejemplos

Simple IfError

Fórmula Descripción Resultado
IfError( 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
IfError( 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
IfError( 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
IfError( 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( "There was an internal problem" ) ) 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. false
IsError( Blank() ) El argumento está en blanco, pero no es un error. false
IsError( 1/0 ) El argumento es un error. true
If( IsError( 1/0 ), Notify( "There was an internal problem" ) ) 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). true

Simple IsBlankOrError

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

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 con un valor. En el primer caso, b estará en un estado de error porque la función Value tiene un argumento no válido. Debido a que esto es inesperado para el escritor de fórmulas, se pasa para que el usuario lo vea. En el segundo caso, con la misma fórmula, b tendrá el valor 0, resultando 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 iba a ser un problema en un contexto particular, esos errores podrían filtrarse, dejando intactos todos los demás errores 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 mostrará el valor 1234, ya que se trata de una entrada válida para la función Value.

  5. En TextInput1, introduzca ToInfinity.

    Label1 mostrará el valor -1, ya que no se trata de una entrada válida para la función Value. 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órmulas para Power Apps