Partilhar via


Funções Error, IfError, IsError, IsBlankOrError

Aplica-se a: Aplicações de tela Colunas de fórmula do Dataverse Fluxos de ambiente de trabalho Aplicações condicionadas por modelo Power Platform CLI

Deteta erros e disponibiliza um valor alternativo ou efetua uma ação. Crie um erro personalizado ou transmita um erro.

Nota

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 devolve 0 se o valor de x for zero, porque 1/x irá produzir 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 devolverá o valor de um dos seus argumentos. Os tipos de todos os valores que podem ser devolvidos por IfError têm de ser compatíveis.

No último exemplo, Patch devolverá um registo que não seja compatível com os Booleanos utilizados para as fórmulas Replacement ou o 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 forem, o segundo argumento será forçado a corresponder ao tipo do primeiro argumento.

O Excel apresenta #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 texto "#DIV/0!" será forçada para o tipo do primeiro argumento como IfError, que é um número. O resultado de IfError será ainda outro erro, uma vez que a cadeia de texto não pode ser forçada. 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 registos de informação de erros, sendo que FirstError é um atalho para o primeiro registo desta tabela. FirstError devolve sempre o mesmo valor que First( AllErrors ).

Os registos de erros incluem:

Campo Tipo Descrição
Variante Enumeração de ErrorKind (número) Categoria do erro.
Mensagem Cadeia de texto Mensagem sobre o erro, adequada para ser apresentada ao utilizador final.
Origem 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 dependente de um controlo property, esta será estará no formulário ControlName.PropertyName.
Observado 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 dependente de um controlo property, esta será estará no formulário ControlName.PropertyName.
Detalhes Registo Detalhes do erro. Atualmente, só são fornecidos detalhes sobre 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:

Controlo button ativado a mostrar uma notificação a partir da função Notify.

Normalmente, haverá apenas um erro com o qual FirstError pode trabalhar de forma suficiente. 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.

A utilização de IsError impedirá processamentos futuros 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, foi utilizado um valor em branco para representar valores nulos das bases 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.

A utilização de IsBlankOrError impedirá 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. Tipo é obrigatório. FirstError pode ser transmitido diretamente.
  • ErrorTable – Obrigatório. Tabela de registos de informação de erros. AllErrors pode ser transmitido diretamente.

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

  • Value(s) – obrigatório. A fórmula ou fórmulas a testar para um valor de erro.
  • Replacement(s) – 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( Value )
IsBlankOrError( Valor )

  • Value – 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( "Ocorreu 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. false
IsError( Blank() ) O argumento é um branco, mas não um erro. false
IsError( 1/0 ) O argumento é um erro. verdadeiro
If( IsError( 1/0 ), Notify( "Ocorreu 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. false
IsBlankOrError( Blank() ) 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 eliminados e substituídos por um valor. No primeiro caso, b estará num estado de erro porque a função Value tem um argumento inválido. Uma vez que este valor é inesperado para o autor da fórmula, o mesmo é transmitido para que o utilizador o veja. No segundo caso, com a mesma fórmula, b terá 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 num determinado contexto, 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

  1. Adicione um controlo Text input e atribua-lhe o nome TextInput1 caso não tenha esse nome por predefinição.

  2. Adicione um controlo de Label e dê-lhe o nome Label1, caso não tenha esse nome por predefinição.

  3. Defina a fórmula da propriedade Text de Label1 para:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. Em TextInput1, introduza 1234.

    Será apresentado o valor 1234 para Label1, pois esta é uma entrada válida para a função Value.

  5. Em TextInput1, introduza ToInfinity.

    Será apresentado o valor -1 para Label1, 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.

Consulte também

Referência de fórmula Power Apps