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
Se unha aplicación desactivou a función de xestión de erros a nivel de fórmula en Configuración>Actualizacións> Retirada, esas funcións non funcionarán correctamente.
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
produce 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 devolve o valor dun dos seus argumentos. Os tipos de todos os valores que poden ser devoltos por IfError deben ser compatibles.
No último exemplo, Parche devolve un rexistro que non é compatible cos booleanos usados nas fórmulas de substitución ou o 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 é coaccionado para que coincida co tipo do primeiro argumento.
Excel mostra #DIV/0! cando se produce 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!"
obrígase ao tipo do primeiro argumento a IfError, que é un número. O resultado de IfError é outro erro xa que non se pode forzar 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 un atallo ao primeiro rexistro desta táboa. FirstError sempre devolve o mesmo valor que First( AllErrors ).
Os rexistros de erro inclúen:
Campo | Tipo | Descripción |
---|---|---|
amable | Enumeración ErrorKind (número) | Categoría do erro. |
Mensaxe | Cadea de texto | Mensaxe sobre o erro, apta para ser mostrada ao usuario final. |
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, este valor está na forma 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, este valor está na forma ControlName.PropertyName. |
Detalles | Rexistro | Detalles sobre o erro. Actualmente, 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:
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.
O uso de IsError impide que se siga procesando o 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 de engadir o tratamento de erros, utilizouse un valor en branco para representar tanto os valores nulos das bases de datos como os 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 impide que se siga procesando o 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
Erro( ErrorRecord )
Erro( Táboa de erros )
- ErrorRecord – Obrigatorio. Rexistro de información de erros, incluíndo Tipo, Mensaxe e outros campos. Requírese tipo . FirstError pódese pasar directamente.
- ErrorTable – Obrigatorio. Táboa de rexistros de información de erros. Todos os erros pódense pasar directamente.
Se Erro( Valor1, Substitución1 [, Valor2 , Substitución2, ... [, DefaultResult ] ] )
- Valores – Obrigatorio. Fórmula(s) para probar un valor de erro.
- Substitucións – Obrigatorios. 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( Valor )
IsBlankOrError( Valor )
- Valor – Obrigatorio. Fórmula para probar.
Exemplos
IfError sinxelo
Fórmula | Descripción | Resultado |
---|---|---|
Se Erro (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 |
Se Erro (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 |
Se Erro (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 |
Se Erro( 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, Notificar("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. | falso |
IsError(Baleiro()) | O argumento está en branco, pero non é un erro. | falso |
IsError (1/0) | O argumento é un erro. | verdade |
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). | verdade |
IsBlankOrError simple
Fórmula | Descripción | Resultado |
---|---|---|
IsBlankOrError (1) | O argumento non é un erro nin un valor en branco. | falso |
IsBlankOrError(Balco()) | O argumento é un valor en branco. | verdade |
IsBlankOrError (1/0) | O argumento é un erro. | verdade |
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 está 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 ten o valor 0, resultando 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 sabé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
Engada un control de Entrada de texto e noméeo TextInput1 se non ten ese nome por defecto.
Engada un control de Etiqueta e noméeo Label1 se non ten ese nome por defecto.
Estableza a fórmula para a propiedade de Texto de Label1 en:
IfError( Value( TextInput1.Text ), -1 )
En TextInput1, ingrese 1234.
A etiqueta1 mostra o valor 1234 xa que é unha entrada válida para a función Valor.
En TextInput1, ingrese ToInfinity.
A etiqueta1 mostra 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.