Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
| Funções | Aplica-se a |
|---|---|
| Error IfError IsError |
|
| IsBlankOrError |
|
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 IfError função testa 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 se assemelha à da função If: IfError testa erros, enquanto If testa verdadeiro.
Use IfError para substituir um erro por um valor válido para que os cálculos a jusante possam 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.
Use IfError para executar uma ação e só continue o processamento se a ação tiver sido bem-sucedida. Aplicando-se 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.
Com base no último exemplo, o valor de retorno de pode ser verificado IfError para determinar se houve algum problema:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ); false,
Patch( DS2, ... ), Notify( "problem in the second action" ); false,
true
)
Compatibilidade de tipos
IfError Devolve o valor de um dos seus argumentos. Os tipos de todos os valores que podem ser retornados devem IfError 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. O que é bom, já que não há nenhuma situação em que o valor de retorno dessas chamadas de patch seria retornado por IfError.
Nota
Enquanto o comportamento em processo para uma mudança, os tipos de todos os argumentos devem IfError ser compatíveis atualmente.
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 é mais um erro, uma vez que a cadeia de IfError texto não pode ser coagida. Como correção, converta o primeiro argumento em uma cadeia de caracteres de texto para que IfError sempre retorne uma cadeia de caracteres de texto:
IfError( Text( 1/x ), "#DIV/0!" )
Como visto acima, IfError pode retornar um erro se o Replacement ou DefaultResult for 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 ).
Error Os registos 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 IsError função testa um valor de erro.
O valor devolvido é um Booleano true ou false.
O uso IsError impede qualquer processamento adicional do erro.
IsBlankOrError
A IsBlankOrError função testa um valor em branco ou um valor de Or( IsBlank( X ), IsError( X ) )erro e é o equivalente a .
Ao habilitar o tratamento de erros para aplicativos existentes, considere substituir IsBlank por IsBlankOrError para preservar o comportamento do aplicativo 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. Error manipulando separa essas duas interpretações de blank , o que pode alterar o comportamento de aplicativos existentes que continuam a usar IsBlank.
O valor devolvido é um booleano true ou false.
O uso IsBlankOrError impede qualquer processamento adicional do erro.
Use a Error função para criar e relatar 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. Você pode criar e retornar seu próprio erro, completo com Kind e Message, usando o mesmo registro descrito acima para a IfError função.
No contexto do IfError, use a Error função para relançar ou passar por um erro. Por exemplo, sua lógica pode IfError decidir que, em alguns casos, um erro pode ser ignorado com segurança, mas em outros casos o erro é importante enviar. Dentro IfError ou App.OnError, use Error( FirstError ) para passar por um erro.
A Error função também pode ser passada uma tabela de erros, como seria encontrado na tabela AllErrors . Use Error( AllErrors ) para relançar todos os erros e não apenas o primeiro.
Um registro em branco ou uma tabela vazia passada para Error resulta em nenhum erro.
Sintaxe
Error( ErrorRecord )
Error( Tabela de erros )
- ErrorRecord – Obrigatório. Error registro de informações, 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( Valor1, Substituição1 [, Valor2, Substituição2, ... [, 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
Simples 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, Notificar( "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 de retorno de é o valor de retorno de IfErrorNotify, coagido para o mesmo tipo que o primeiro argumento para IfError (um número). | 1 |
Simples 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 ), Notificar( "Houve um problema interno" ) | O argumento para retornar um valor de erro (devido à IsError 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 |
Simples Error
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. Usado com a função, os Error erros esperados podem ser removidos e os erros restantes retidos e relatados. 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 envolver a função Value com IfError, o rótulo não mostraria nenhum valor, pois o valor de erro é tratado como um espaço em branco.