Compartir por


Funcións Erro, IfError, IsError, IsBlankOrError

Aplícase a: Aplicacións de lenzo Dataverse columnas de fórmulas Fluxos de escritorio Aplicacións baseadas en modelos Power Pages Power Platform CLI

Detecta erros e proporciona un valor alternativo ou toma medidas. Crea un erro personalizado ou pasa por un erro.

Nota

IfError

A función IfError proba os valores ata que atopa un erro. Se a función descobre un erro, a función avalía e devolve un correspondente valor de substitución e detén a súa avaliación. Tamén se pode fornecer un valor por defecto cando non se atopen erros. A estrutura de IfError aseméllase á da función If: IfError proba en busca de erros, mentres que If proba en busca do valor verdadeiro.

Use IfError para substituír un erro por un valor válido para que os cálculos descendentes poidan continuar. Por exemplo, use esta función se a entrada do usuario pode producir unha división por cero:

IfError( 1/x, 0 )

Esta fórmula devolve 0 se o valor de x é cero, xa que 1/x producirá un erro. Se x non é cero, entón 1/x é devolto.

Deter o procesamento

Ao encadear fórmulas xuntas en fórmulas de comportamento, como:

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

A segunda función Patch para DS2 intentarase aínda que Patch para DS1 falle. O alcance dun erro está limitado a cada fórmula que se encadea.

Use IfError para facer unha acción e continuar a tramitación só se a acción tivo éxito. Aplicación de IfError a este exemplo:

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

Se o Parche de DS1 ten un problema, a primeira Notificación execútase. Non se produce outro procesamento, incluído o segundo Parche de DS2. Se o primeiro Parche ten éxito, o segundo Parche executarase.

Se se fornece, o argumento opcional DefaultResult é devolto se non se descobren erros. Sen este argumento, o último argumento de Valor devólvese.

Baseándose no último exemplo, o valor de retorno de IfError pódese comprobar para determinar se hai algún problema:

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

Compatibilidade dos tipos

IfError devolverá o valor dun dos seus argumentos. Os tipos de todos os valores que poden ser devoltos por IfError deben ser compatibles.

No último exemplo, o Parche devolverá un rexistro que non é compatible cos booleanos empregados para as fórmulas de Substitución ou para DefaultResult. O que está ben, xa que non hai ningunha situación na que o valor de retorno destas chamadas de Parche serían devoltas por IfError.

Nota

Mentres o comportamento está en proceso de cambio, o tipo de todos os argumentos en IfError debe ser compatible actualmente.

No exemplo sinxelo descrito anteriormente:

IfError( 1/x, 0 )

Os tipos de 1/x e 0 eran compatibles xa que ambos eran números. Se non o son, o segundo argumento será coaccionado para que coincida co tipo do primeiro argumento.

Excel mostrará #DIV/0! cando se produza unha división por cero.

Considere IfErrorco seguinte no seu lugar:

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

A fórmula anterior non funcionará. A cadea de texto "#DIV/0!" coaccionarase co tipo do primeiro argumento en IfError, que é un número. O resultado de IfError será outro erro, xa que non se pode coaccionar a cadea de texto. Como solución, converta o primeiro argumento nunha cadea de texto para que IfError sempre devolva unha cadea de texto:

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

Como se pode ver, IfError pode devolver un erro se Replacement ou DefaultResult é un erro.

FirstError / AllErrors

Dentro das fórmulas de substitución, a información acerca dos erros atopada está dispoñible a través do rexistro FirstError e a táboa AllErrors. AllErrors é unha táboa de rexistros de información de erros con FirstError sendo un atallo ao primeiro rexistro desta táboa. FirstError sempre devolverá o mesmo valor que First( AllErrors ).

Os rexistros de erro inclúen:

Campo Tipo Descripción
Tipo Enumeración ErrorKind (número) Categoría do erro.
Mensaxe Cadea de texto Mensaxe sobre o erro, apta para ser mostrada ao usuario final.
Código fonte Cadea de texto Localización onde se orixinou o erro, utilizada para informar. Por exemplo, para unha fórmula vinculada a unha propiedade de control, esta terá o formato ControlName.PropertyName.
Observado Cadea de texto Localización onde se extraeu o erro para o usuario, usado para informar. Por exemplo, para unha fórmula vinculada a unha propiedade de control, esta terá o formato ControlName.PropertyName.
Detalles Rexistro Detalles sobre o erro. Na actualidade, só se proporcionan detalles para os erros de rede. Este rexistro inclúe HttpStatusCode que contén o código de estado HTTP e HttpResponse que contén o corpo do resposta do conector ou servizo.

Por exemplo, considere a seguinte fórmula como a propiedade OnSelect do control de botón.

Set( a, 1/0 )

E esta fórmula na propiedade OnSelect dun segundo control de Botón:

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

A fórmula de exemplo anterior amosaría a seguinte faixa cando os dous botóns están activados en secuencia:

O control de botón activouse, mostrando unha notificación da función Notificar.

Normalmente, só haberá un erro co que FirstError pode funcionar suficientemente. Non obstante, hai escenarios nos que se poden devolver varios erros. Por exemplo, cando se utiliza un operador de encadeamento de fórmulas ou a función Simultánea. Incluso nestas situacións, informar de FirstError pode ser suficiente para revelar un problema en vez de sobrecargar un usuario con varios erros. Se aínda ten o requisito de traballar con cada erro individualmente, pode utilizar a táboa AllErrors.

IsError

A función IsError comproba se hai un valor de erro.

O valor devolto é un booleano verdadeiro ou falso.

Usando IsError evitará outro procesamento do erro.

IsBlankOrError

A función IsBlankOrError comproba un valor en branco ou un valor de erro e é o equivalente a Or( IsBlank( X ), IsError( X ) ).

Ao activar o tratamento de erros para aplicacións existentes, considere a posibilidade de substituír IsBlank por IsBlankOrError para preservar o comportamento da aplicación existente. Antes da adición do tratamento de erros, empregouse un valor en branco para representar tanto valores nulos das bases de datos como valores de erro. O tratamento de erros separa estas dúas interpretacións de en branco, o que podería cambiar o comportamento das aplicacións existentes que seguen a usar IsBlank.

O valor devolto é un booleano verdadeiro ou falso.

O uso de IsBlankOrError evitará calquera outro procesamento do erro.

Use a función Erro para crear e informar de erros personalizados. Por exemplo, pode ter lóxica para determinar se algún valor dado é válido para o seu contexto ou non, algo que non se comprobou automaticamente para detectar un problema. Pode crear e devolver o seu propio erro, completo con Tipo e Mensaxe, utilizando o mesmo rexistro descrito anteriormente para a función IfError.

No contexto de IfError, use a función Erro para volver lanzar ou pasar por un erro. Por exemplo, a súa lóxica en IfError pode decidir que nalgúns casos se pode ignorar un erro de forma segura, pero noutros casos é importante enviar o erro. Dentro de IfError ou App.OnError, use Error( FirstError) para pasar por un erro.

Á función Erro tamén se lle pode pasar unha táboa de erros, como se atoparía na táboa AllErrors. Use Error( AllErrors ) para volver lanzar todos os erros e non só o primeiro.

Un rexistro en branco ou unha táboa baleira pasada a Erro non produce ningún erro.

Sintaxe

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord – Obrigatorio. Rexistro de información de erros, incluíndo Tipo, Mensaxe e outros campos. Kind é obrigatorio. FirstError pódese pasar directamente.
  • ErrorTable – Obrigatorio. Táboa de rexistros de información de erros. AllErrors pódese pasar directamente.

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

  • Value(s) – Obrigatorio. Fórmula(s) para probar un valor de erro.
  • Replacement(s) – Obrigatorio. As fórmulas para avaliar e os valores para devolver se os argumentos de Valor coincidentes devolveron un erro.
  • DefaultResult – Opcional. As fórmulas para avaliar se a fórmula non atopa ningún erro.

IsError( Value )
IsBlankOrError( Value )

  • Value – Obrigatorio. Fórmula para probar.

Exemplos

IfError sinxelo

Fórmula Descripción Resultado
IfError( 1, 2 ) O primeiro argumento non é un erro. A función non ten outros erros que comprobar e ningún valor de retorno por defecto. A función devolve o último argumento de valor avaliado. 1
IfError( 1/0, 2 ) O primeiro argumento devolve un valor de erro (por mor da división por cero). A función avalía o segundo argumento e devólveo como resultado. 2
IfError( 10, 20, 30 ) O primeiro argumento non é un erro. A función non ten outros erros que comprobar pero ten un valor de retorno por defecto. A función devolve o argumento DefaultResult. 30
IfError( 10, 11, 20, 21, 300 ) O primeiro argumento 10 non é un erro, polo que a función non avalía a substitución 11 correspondente dese argumento. O terceiro argumento 20 tampouco é un erro, polo que a función non avalía a substitución 21 correspondente dese argumento. O quinto argumento 300 non ten substitución correspondente e é o resultado por defecto. A función devolve ese resultado porque a fórmula non contén erros. 300
IfError( 1/0, Notify( "Houbo un problema interno" ) ) O primeiro argumento devolve un valor de erro (pola división por cero). A función avalía o segundo argumento e mostra unha mensaxe ao usuario. O valor de retorno de IfError é o valor de retorno de Notificar, coaccionado ao mesmo tipo que o primeiro argumento en IfError (un número). 1

IsError sinxelo

Fórmula Descripción Resultado
IsError( 1 ) O argumento non é un erro. false
IsError( Blank() ) O argumento está en branco, pero non é un erro. false
IsError( 1/0 ) O argumento é un erro. true
If( IsError( 1/0 ), Notify( "Houbo un problema interno" ) ) O argumento para IsError devolve un valor de erro (por mor da división por cero). Esta función devolve verdadeiro, o que provoca que If mostre unha mensaxe ao usuario coa función Notify. O valor de retorno de If é o valor de retorno de Notify, coaccionado ao mesmo tipo que o primeiro argumento en If (un booleano). true

IsBlankOrError simple

Fórmula Descripción Resultado
IsBlankOrError( 1 ) O argumento non é un erro nin un valor en branco. false
IsBlankOrError( Blank() ) O argumento é un valor en branco. true
IsBlankOrError( 1/0 ) O argumento é un erro. true

Erro sinxelo

Neste exemplo, as datas valídanse entre si, o que provoca un erro se hai algún problema.

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

Neste exemplo, permítese pasar algúns erros mentres que outros se suprimen e substitúense por un valor. No primeiro caso, b estará nun estado de erro porque a función Valor ten un argumento non válido. Debido a que isto é inesperado polo escritor de fórmulas, pásase para que o usuario o vexa. No segundo caso, coa mesma fórmula, b terá o valor 0, dando como resultado unha división por cero. Neste caso, o escritor da fórmula pode saber que isto é aceptable para esta lóxica, suprimir o erro (non se mostra ningunha faixa) e devolver -1 no seu 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

A táboa AllErrors pódese filtrar como calquera outra táboa. Usado coa función Erro, pódense eliminar os erros esperados e conservar e informar os erros restantes. Por exemplo, se soubésemos que a división por cero non ía ser un problema nun contexto particular, eses erros poderían ser filtrados, deixando todos os demais erros intactos coa seguinte fórmula:

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

Paso a paso

  1. Engada un control de Entrada de texto e noméeo TextInput1 se non ten ese nome por defecto.

  2. Engada un control de Etiqueta e noméeo Label1 se non ten ese nome por defecto.

  3. Estableza a fórmula para a propiedade de Texto de Label1 en:

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

    Label1 amosará o valor 1234 xa que esta é unha entrada válida para a función Valor.

  5. En TextInput1, ingrese ToInfinity.

    Label1 amosará o valor -1 xa que esta non é unha entrada válida para a función Valor. Sen envolver a función Valor con IfError, a etiqueta non mostraría ningún valor xa que o valor de erro é tratado como en branco.

Consulte tamén

Referencia da fórmula para Power Apps