Funções Error, IfError, IsError, IsBlankOrError
Aplica-se a: Colunas Dataverse de fórmula de aplicativos de tela Fluxos de área de trabalho CLI de aplicativos Power Pages Power Platform orientados por modelo
Deteta erros e disponibiliza um valor alternativo ou efetua uma ação. Crie um erro personalizado ou transmita um erro.
Nota
Se um aplicativo tiver desabilitado o recurso de gerenciamento de erros no nível da fórmula em Configurações>Atualizações>Desativadas, essas funções não funcionarão corretamente.
IfError
A função IfError testa os valores até encontrar um erro. Se a função descobrir um erro, a função avalia e devolve um valor de substituição correspondente e para a avaliação adicional. Um valor predefinido também pode ser fornecido para quando não são encontrados erros. A estrutura de IfError é semelhante à da função If: IfError testa a existência de erros, enquanto If testa para valores true.
Utilize IfError para substituir um erro com um valor válido para os cálculos a jusante poderem continuar. Por exemplo, utilize esta função se a entrada de utilizador puder resultar numa divisão por zero:
IfError( 1/x, 0 )
Esta fórmula retorna 0
se o valor de x
for zero, como 1/x
produz um erro. Se x
não for zero, então é devolvido 1/x
.
Parar o processamento adicional
Ao encadear fórmulas em fórmulas de comportamento, tais como:
Patch( DS1, ... );
Patch( DS2, ... )
A segunda função Patch para DS2
será tentada, mesmo que o Patch para DS1
falhe. O âmbito de um erro está limitado a cada fórmula que está encadeada.
Utilize IfError para executar uma ação e continuar a processar apenas se a ação tiver sido concluída com êxito. Aplicar IfError a este exemplo:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ),
Patch( DS2, ... ), Notify( "problem in the second action" )
)
Se o Patch de DS1
tiver um problema, é executado o primeiro Notify. Não ocorre nenhum processamento adicional, incluindo o segundo Patch de DS2
. Se o primeiro Patch for bem-sucedido, o segundo Patch será executado.
Se for fornecido, o argumento DefaultResult será devolvido se não forem detetados erros. Sem este argumento, é devolvido o último argumento Value.
A partir do último exemplo, o valor de devolução de IfError pode ser verificado para determinar se ocorreram problemas:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ); false,
Patch( DS2, ... ), Notify( "problem in the second action" ); false,
true
)
Compatibilidade de tipos
IfError retorna o valor de um de seus argumentos. Os tipos de todos os valores que podem ser devolvidos por IfError têm de ser compatíveis.
No último exemplo, Patch retorna um registro que não é compatível com os booleanos usados para as fórmulas Replacement ou DefaultResult . Não há qualquer problema, uma vez que não há qualquer situação em que o valor devolvido por estas chamadas para Patch seriam devolvidas pelo IfError.
Nota
Enquanto o comportamento está no processo para uma alteração, os tipos de todos os argumentos para IfError têm de ser compatíveis.
No exemplo simples descrito anteriormente:
IfError( 1/x, 0 )
Os tipos de 1/x
e 0
eram compatíveis porque ambos eram números. Se não estiverem, o segundo argumento é coagido a corresponder ao tipo do primeiro argumento.
Excel exibe #DIV/0! quando ocorre uma divisão por zero.
Em vez disso, considere IfError com o seguinte:
IfError( 1/x, "#DIV/0!" )
A fórmula acima não vai funcionar. A cadeia de caracteres "#DIV/0!"
de texto é coagida ao tipo do primeiro argumento para IfError, que é um número. O resultado de IfError é mais um erro, uma vez que a cadeia de texto não pode ser coagida. Como correção, converta o primeiro argumento numa cadeia de texto para IfError devolver sempre uma cadeia de texto:
IfError( Text( 1/x ), "#DIV/0!" )
Como visto acima, IfError poderá devolver um erro se Replacement ou DefaultResult gerar um erro.
FirstError/AllErrors
Nas fórmulas de substituição, as informações sobre os erros encontrados estão disponíveis através do registo FirstError e da tabela AllErrors. AllErrors é uma tabela de registros de informações de erro com FirstError sendo um atalho para o primeiro registro desta tabela. FirstError sempre retorna o mesmo valor que First( AllErrors ).
Os registos de erros incluem:
Campo | Tipo | Descrição |
---|---|---|
Tipo | Enumeração de ErrorKind (número) | Categoria do erro. |
Mensagem | Cadeia de texto | Mensagem sobre o erro, adequada para ser apresentada ao utilizador final. |
Fonte | Cadeia de texto | Localização de onde o erro foi original, utilizada para a criação de relatórios. Por exemplo, para uma fórmula vinculada a uma propriedade de controle, esse valor está no formato ControlName.PropertyName. |
Observada | Cadeia de texto | Localização onde o erro é comunicado ao utilizador, utilizado para a criação de relatórios Por exemplo, para uma fórmula vinculada a uma propriedade de controle, esse valor está no formato ControlName.PropertyName. |
Detalhes | Registo | Detalhes do erro. Atualmente, os detalhes são fornecidos apenas para erros de rede. Este registo inclui HttpStatusCode, que contém o código de estado HTTP e HttpResponse, que contém o corpo da resposta do conector ou serviço. |
Por exemplo, considere a seguinte fórmula como propriedade OnSelect de um controlo Button:
Set( a, 1/0 )
E esta fórmula na propriedade OnSelect de um segundo controlo Button:
IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )
A fórmula de exemplo superior mostraria o seguinte banner quando os dois botões são ativados em sequência:
Normalmente, haverá apenas um erro com o qual FirstError pode trabalhar suficientemente. No entanto, existem cenários nos quais podem ser devolvidos vários erros. Por exemplo, ao utilizar um operador de encadeamento de fórmulas ou a função Concurrent. Mesmo nestas situações, o relatório de FirstError pode ser suficiente para revelar um problema, em vez de sobrecarregar um utilizador com vários erros. Se ainda assim tiver a necessidade de trabalhar com cada erro individualmente, pode utilizar a tabela AllErrors.
IsError
A função IsError testa um valor de erro.
O valor devolvido é um Booleano true ou false.
Usar IsError impede qualquer processamento adicional do erro.
IsBlankOrError
A função IsBlankOrError testa um valor em branco ou um valor de erro e é equivalente a Or( IsBlank( X ), IsError( X ) )
.
Ao ativar gestão de erro para apps existentes, considere substituir IsBlank por IsBlankOrError para preservar o comportamento da app existente. Antes da adição do tratamento de erros, um valor em branco era usado para representar valores nulos de bancos de dados e valores de erro. O manuseamento de erros separa estas duas interpretações de branco que podem alterar o comportamento das aplicações existentes que continuam a utilizar IsBlank.
O valor devolvido é um booleano true ou false.
Usar IsBlankOrError impede qualquer processamento adicional do erro.
Utilize a função Error para criar e comunicar um erro personalizado. Por exemplo, poderá ter uma lógica para determinar se determinado valor é válido para o seu contexto ou não – algo não verificado automaticamente para um problema. Pode criar e devolver o seu próprio erro, completo com Tipo e Mensagem, utilizando o mesmo registo descrito acima para a função IfError.
No contexto de IfError, utilize a função Error para relançar ou transmitir um erro. Por exemplo, a sua lógica em IfError pode decidir que, em alguns casos, um erro pode ser ignorado com segurança, mas, noutros casos, é importante que o erro seja transmitido. Em IfErrorou App.OnError, utilize Error(FirstError) para transmitir um erro.
À função Error também pode ser transmitida uma tabela de erros, tal como poderia ser encontrada na tabela AllErrors. Utilize Error( AllErrors ) para relançar todos os erros e não apenas o primeiro.
Um registo em branco ou uma tabela vazia transmitida a Error resulta em nenhum erro.
Sintaxe
Error( ErrorRecord )
Error( ErrorTable )
- ErrorRecord – Obrigatório. Registo de informações de erro, incluindo Tipo, Mensagem e outros campos. O tipo é necessário. FirstError pode ser passado diretamente.
- ErrorTable – Obrigatório. Tabela de registos de informação de erros. AllErrors pode ser passado diretamente.
IfError(Value1,Replacement1 [, Value2,Replacement2 , ... [, DefaultResult ] ] )
- Valores – Obrigatório. A fórmula ou fórmulas a testar para um valor de erro.
- Substituições – Obrigatório. As fórmulas a avaliar e os valores a devolver se os argumentos Value correspondentes tiverem devolvido um erro.
- DefaultResult – Opcional. As fórmulas a avaliar se a fórmula não encontrar erros.
IsError( Valor )
IsBlankOrError( Valor )
- Valor – Obrigatório. Fórmula para testar.
Exemplos
Simple IfError
Fórmula | Descrição | Resultado |
---|---|---|
IfError( 1, 2 ) | O primeiro argumento não é um erro. A função não tem outros erros para verificar e nenhum valor devolvido predefinido. A função devolve o último argumento value avaliado. | 1 |
IfError( 1/0, 2 ) | O primeiro argumento devolve um valor de erro (devido à divisão por zero). A função avalia o segundo argumento e devolve-o como resultado. | 2 |
IfError( 10, 20, 30 ) | O primeiro argumento não é um erro. A função não tem outros erros para verificar, mas tem um valor devolvido predefinido. A função devolve o argumento DefaultResult. | 30 |
IfError( 10, 11, 20, 21, 300 ) | O primeiro argumento 10 não é um erro, pelo que a função não avalia a substituição correspondente do argumento 11. O terceiro argumento 20 também não é um erro, pelo que a função não avalia a substituição correspondente desse argumento 21. O quinto argumento 300 não tem substituição correspondente e é o resultado predefinido. A função devolve esse resultado porque a fórmula não contém erros. | 400 |
IfError( 1/0, Notify( "Houve um problema interno" ) | O primeiro argumento devolve um valor de erro (devido à divisão por zero). A função avalia o segundo argumento e apresenta uma mensagem ao utilizador. O valor devolvido de IfError é o valor devolvido de Notify, que tem de ser do mesmo tipo que o primeiro argumento de IfError (um número). | 1 |
Simple IsError
Fórmula | Descrição | Resultado |
---|---|---|
IsError( 1 ) | O argumento não é um erro. | falso |
IsError( Em branco() ) | O argumento é um branco, mas não um erro. | falso |
IsError( 1/0 ) | O argumento é um erro. | verdadeiro |
If( IsError( 1/0 ), Notify( "Houve um problema interno" ) | O argumento para IsError devolve um valor de erro (devido à divisão por zero). Esta função retorna verdadeiro, o que faz com que o If apresente uma mensagem ao utilizador com a função Notify. O valor devolvido de If é o valor devolvido de Notify, que tem de ser do mesmo tipo que o primeiro argumento de If (um booleano). | verdadeiro |
Simples IsBlankOrError
Fórmula | Descrição | Resultado |
---|---|---|
IsBlankOrError( 1 ) | O argumento não é um erro nem um branco. | falso |
IsBlankOrError( Em branco() ) | O argumento está em branco. | verdadeiro |
IsBlankOrError( 1/0 ) | O argumento é um erro. | verdadeiro |
Erro simples
Neste exemplo, as datas são validadas entre si, resultando num erro se houver um problema.
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
Neste exemplo, alguns erros podem ser transmitidos enquanto outros são suprimidos e substituídos por um valor. No primeiro caso,b está em um estado de erro porque a função Value tem um argumento inválido. Como isso é inesperado pelo escritor de fórmulas, ele é passado para que o utente o veja. No segundo caso, com a mesma fórmula,b tem o valor 0, resultando numa divisão por zero. Neste caso, o autor da fórmula poderá saber isto é aceitável para esta lógica, eliminar o erro (não é apresentada nenhuma faixa) e devolver -1, alternativamente.
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 tabela AllErrors pode ser filtrada como qualquer outra tabela. Utilizados com a função Error, é possível remover os erros esperados, sendo os erros restantes retidos e reportados. Por exemplo, se soubéssemos que a divisão por zero não seria um problema em um contexto específico, esses erros poderiam ser filtrados, deixando todos os outros erros intactos com a seguinte fórmula:
Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )
Passo a passo
Adicione um controlo Text input e atribua-lhe o nome TextInput1 caso não tenha esse nome por predefinição.
Adicione um controlo de Label e dê-lhe o nome Label1, caso não tenha esse nome por predefinição.
Defina a fórmula da propriedade Text de Label1 para:
IfError( Value( TextInput1.Text ), -1 )
Em TextInput1, introduza 1234.
Label1 mostra o valor 1234 , pois esta é uma entrada válida para a função Value.
Em TextInput1, introduza ToInfinity.
Label1 mostra o valor-1 , pois esta não é uma entrada válida para a função Value. Sem incluir a função Value na função IfError, a etiqueta não apresentaria valores, visto que o valor de erro é tratado como se estivesse blank.