Manexo de erros

O comportamento descrito neste artigo está dispoñible só cando se activa a función de xestión de erros a nivel de fórmula .

Power Fx soporta o manexo de erros a nivel de fórmula. Esta función está activada por defecto para todas as aplicacións novas. Con todo, algunhas aplicacións antigas poden telo desactivado na configuración da aplicación. Mantén esta función activada.

  1. Abre a aplicación de canvas en modo edición.
  2. Vai á pestana de Actualizacións>> Retirada.
  3. Asegúrate de desactivar a xestión a nivel de fórmula desactivada.

Para máis información, consulte Controlar que funcións están activadas.

Os erros ocorren. As redes caen, o almacenamento énchese, entran valores inesperados. É importante que a súa lóxica siga funcionando correctamente ante posibles problemas.

De forma predeterminada, os erros flúen a través das fórmulas dunha aplicación e son informados ao usuario final da aplicación. Deste xeito, o usuario final sabe que pasou algo inesperado. Poden solucionar o problema eles mesmos cunha entrada diferente, ou poden informar ao propietario da aplicación.

Como creador de aplicacións, controla os erros na túa aplicación:

  • Detectar e xestionar un erro. Se hai posibilidade de que ocorra un erro, escribe as fórmulas da aplicación para detectar a condición de erro e tenta de novo a operación. O usuario final non debe preocuparse de que se producise un erro porque o fabricante tivo en conta a posibilidade. Captura o erro usando as funcións IfError, IsError e IsErrorOrBlank dentro dunha fórmula.
  • Reporta un erro. Se un erro non se xestiona na fórmula onde o atopaches, o erro aparece no manexador App.OnError . Non podes substituír o erro porque xa ocorreu e forma parte dos cálculos das fórmulas. Pero pode usar App.OnError para controlar como se informa do erro ao usuario final, incluída a supresión de todos os informes de erros. App.OnError tamén proporciona un punto de estrangulamento común para a notificación de erros en toda a aplicación.
  • Crea e volve lanzar un erro. Finalmente, podes detectar unha condición de erro coa túa propia lóxica, unha condición específica da túa aplicación. Use a función Erro para crear erros personalizados. Usa a función Erro para relanzar un erro despois de ser interrogado en IfError ou App.OnError.

Comezar

Comecemos cun exemplo sinxelo.

  1. Crea unha nova pantalla nunha aplicación de Power Apps Canvas.
  2. Insira un control de TextInput. Por defecto chámase TextInput1.
  3. Insira o control Etiqueta.
  4. Axuste a propiedade Texto do control Etiqueta na fórmula.
1/Value( TextInput1.Text )

Captura de pantalla do banner de erro mostrado con 'o valor non pode converterse a un número' para o control de entrada de texto que contén 'Entrada de texto'.

Ves un erro porque o texto predeterminado dun control de TextInput é "Text input", que non se pode converter nun número. Por defecto, isto é algo positivo: o usuario final recibe unha notificación de que algo non funciona como se espera na aplicación.

Obviamente, non queres que o usuario reciba un erro cada vez que inicia esta aplicación. De todos os xeitos, é probable que "Text input" non sexa a opción predeterminada correcta para a caixa de entrada de texto. Para solucionar este problema, cambia a propiedade Default do control TextInput a:

Blank()

Captura de pantalla do banner de erro mostrado con 'división por cero'.

Hmm, agora ves un erro diferente. Operacións matemáticas con espazo en branco, como a división, coaccionan o valor en branco ata un cero. Ese valor provoca unha división por erro cero. Para solucionar este problema, necesitas decidir cal é o comportamento axeitado para esta situación nesta aplicación. A resposta podería ser mostrar en branco cando a entrada de texto está en branco. Podes acadar este obxectivo envolvendo a túa fórmula coa función IfError :

IfError( 1/Value( TextInput1.Text ), Blank() )

Captura de pantalla que non mostra ningún banner de erro, un erro debido a un valor en branco foi substituído por un en branco.

Agora o erro substitúese por un valor válido e desaparece o banner de erro. Pero, pode que te pasases, o IfError que usaches cobre todos os erros, incluíndo escribir un valor incorrecto como "hello". Podes solucionar este problema axustando o teu IfError para que manexe a división só por caso cero e relanzando todos os demais erros:

IfError( 1/Value( TextInput1.Text ), 
         If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )

Captura de pantalla que mostra que non se mostra ningún banner de erro, un erro debido especificamente á división por cero foi substituído por un espazo en branco, se non, o erro volve lanzarse.

Así que, executa a túa aplicación e proba valores diferentes.

Sen ningún valor, xa que cando se inicia a aplicación, non se mostra ningunha resposta xa que o valor predeterminado é blank, pero tampouco se mostra ningún erro dado que o IfError substitúe o erro de división entre cero.

Captura de pantalla que mostra que non se mostra resposta nin ningún banner de erro.

Se escribes un 4, obtés o resultado esperado de 0,25:

Captura de pantalla mostrando 0.25 e sen banner de erro.

E se escribes algo ilegal, como hello, entón recibes un banner de erro:

Captura de pantalla que non mostra valor e banner de erro mostrado pola imposibilidade de converter 'ola' nun número.

Este é un exemplo introdutorio sinxelo. Podes xestionar erros de moitas maneiras diferentes, dependendo das necesidades da aplicación:

  1. En lugar dun banner de erro, poderías mostrar "#Error" no control da etiqueta coa fórmula. Para manter os tipos de substitucións compatibles co primeiro argumento de IfError, necesitas converter explicitamente o resultado numérico a unha cadea de texto usando a función Texto .
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Captura de pantalla que mostra que non hai banner de erro e #Error en vez diso móstrase como resultado.
  2. En lugar de envolver esta instancia específica con IfError, poderías escribir un manexador centralizado de App.OnError . Non podes substituír a cadea mostrada por "#Error" porque o erro xa ocorreu e App.OnError só se proporciona para controlar os informes.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Propagación de erros

Os erros flúen a través das fórmulas tanto como en Excel. Por exemplo, en Excel, se a cela A1 ten a fórmula =1/0, entón A1 mostra o valor #DIV0!de erro :

Captura de pantalla dunha folla de cálculo Excel con A1=1/0 e #DIV/0! Mostrado na cela.

Se célula A2 se refire a A1 cunha fórmula como =A1*2, o erro propágase tamén a través desa fórmula:

Captura de pantalla dunha folla de cálculo Excel con A2=A1*2 e #DIV/0! Mostrado na cela.

O erro substitúe o valor que a fórmula calcularía doutro xeito. Non hai ningún resultado para a multiplicación na cela A2, só o erro da división en A1.

Power Fx funciona do mesmo xeito. En xeral, se proporcionas un erro como argumento a unha función ou operador, a operación non se realiza. O erro de entrada flúe como resultado da operación. Por exemplo, Mid( Text( 1/0 ), 1, 1 ) devolve un erro de División por Cero, xa que o erro máis interno pasa pola función Texto e a función Mid :

Captura de pantalla do banner de erro que mostra operación inválida: división por cero.

En xeral, os erros non pasan polas propiedades de control de Power Apps. Imos ampliar o exemplo anterior cun outro control que amose se a propiedade Text da primeira etiqueta é un estado de erro:

Captura de pantalla que mostra que non se mostra erro no segundo control de etiqueta.

Está ben que os erros non se propaguen a través dun control porque o sistema observa erros na entrada de todas as propiedades do control. O erro non se perde.

A maioría das funcións e operadores seguen a regra de "entrada de erro, saída de erro", pero hai algunhas excepcións. As funcións IsError, IsErrorOrBlank e IfError están deseñadas para traballar con erros, polo que poden non devolver un erro aínda que se lles pase un.

Observación de erros

Power Fx non detecta erros ata que a fórmula usa o valor do erro.

Como resultado, as funcións If e Select poden non devolver un erro se se pasa un. Considere a fórmula como If( false, 1/0, 3 ). Hai un erro de división por cero nesta fórmula, pero como a función If non toma esa rama debido á condición false, Power Fx e Power Apps non informan dun erro:

Captura de pantalla que mostra que non hai ningún banner de erro mostrado coa función If na propiedade de etiqueta Texto.

Usar a función Set cun erro non informa dun erro no momento en que o erro se coloca na variable. Por exemplo, en Power Apps, aquí hai unha fórmula en App.OnStart que coloca unha división por erro cero na variable x:

Captura de pantalla que mostra ningún banner de erro ao establecer chamada á función en App.OnStart.

Non se informa de ningún erro porque non se fai referencia a x. Porén, no momento en que engades un control de etiqueta e configuras a súa propiedade Texto en x, móstrase o erro:

Captura de pantalla que mostra o banner de erro con control de etiqueta referenciando a variable x.

Podes observar erros dentro dunha fórmula usando as funcións IfError, IsError e IsErrorOrBlank . Ao usar estas funcións, podes devolver un valor alternativo, tomar unha acción alternativa ou modificar o erro antes de que sexa detectado e reportado.

Denuncia de erros

Despois de que Power Fx detecte un erro, o seguinte paso é informar do erro ao usuario final.

Ao contrario de Excel, non sempre hai un lugar conveniente para mostrar un resultado de erro, xa que o resultado dunha fórmula pode impulsar unha propiedade como as coordenadas X e Y dun control para o que non hai un lugar conveniente para mostrar texto. Cada host de Power Fx controla como se mostran os erros ao usuario final e canto control ten o fabricante sobre este proceso. En Power Apps, móstrase un banner de erro e úsase App.OnError para controlar como se informa o erro.

É importante ter en conta que App.OnError non pode substituír o erro do mesmo xeito que IfError. No momento en que se executa App.OnError , o erro xa ocorreu, e o resultado propágase a través doutras fórmulas. App.OnError só controla como se notifica o erro ao usuario final e proporciona un gancho para que o creador o rexistre se o desexa.

As variables de ámbito FirstError e AllErrors proporcionan información de contexto sobre o erro ou os erros. Este contexto proporciona información sobre o tipo de erro, onde se orixinou o erro e onde foi observado.

Deter despois dun erro

As fórmulas de comportamento admiten tomar medidas, modificar bases de datos e cambiar o estado. Estas fórmulas permiten realizar máis dunha acción nunha secuencia usando o ; operador de encadeamento (ou ;; dependendo da localización).

Neste caso, por exemplo, o control da grella mostra o que hai na T táboa. Cada botón seleccionado cambia o estado nesta táboa con dúas chamadas Patch:

Captura de pantalla da animación que mostra os dous rexistros na táboa T sendo actualizados con números aleatorios despois de cada clic de botón.

Nunha fórmula de comportamento encadeado, as accións non se deteñen despois do primeiro erro. Modifiquemos o noso exemplo para pasar un número de índice non válido na primeira chamada de Parche. O segundo Parche continúa a pesar deste erro anterior. O primeiro erro infórmase ao usuario final e móstrase como un erro en Studio no control:

Captura de pantalla da animación que mostra que só o segundo rexistro na táboa T se actualiza con números aleatorios despois de cada clic de botón, o primeiro rexistro resultando nun erro.

Usa IfError para deter a execución despois dun erro. De xeito similar á función If, o terceiro argumento desta función proporciona un lugar para poñer accións que só se deben executar se non hai erro:

Captura de pantalla da animación que non mostra cambios en ningún dos dous rexistros na táboa T, porque o IfError está a impedir que a segunda operación se complete despois dun erro.

Se se atopa un erro durante unha das iteracións de ForAll, o resto das iteracións non se detén. ForAll está deseñado para executar cada iteración de forma independente, o que permite a execución en paralelo. Cando o ForAll está completo, devolvese un erro que contén todos os erros atopados (examinando AllErrors en IfError ou App.OnError).

Por exemplo, a seguinte fórmula resulta en que ForAll devolva dous erros (para a división por cero para Value de 0, dúas veces) e Collection ten tres rexistros (para cando Value non é 0): [1, 2, 3].

Clear( Collection ); 
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );

Traballando con varios erros

Dado que unha fórmula de comportamento pode executar máis dunha acción, tamén pode atopar máis dun erro.

Por defecto, a aplicación informa do primeiro erro ao usuario final. Neste exemplo, ambas chamadas Patch fallan, pero a segunda chamada falla cun erro de división por cero. O usuario só ve o primeiro erro sobre o índice:

Captura de pantalla do primeiro erro de índice mostrada nun banner de erro, o segundo erro non se informa.

A función IfError e App.OnError poden acceder a todos os erros atopados usando a variable de alcance AllErrors . Neste caso, podes establecer esta variable como unha variable global e analizar ambos erros atopados. Aparecen na táboa na mesma orde na que se atoparon:

Captura de pantalla da captura dos erros na variable global PatchErrors onde podemos ver que ambos erros están presentes.

As fórmulas de non-comportamento tamén poden devolver múltiples erros. Por exemplo, usar a función Parche cun lote de rexistros para actualizar pode devolver varios erros, un por cada rexistro que falla.

Erros en táboas

Como viste antes, podes gardar erros nas variables. Tamén podes incluír erros en estruturas de datos, como as táboas. Este enfoque é importante porque asegura que un erro en calquera rexistro non pode invalidar toda a táboa.

Por exemplo, considere este control de táboa de datos en Power Apps:

Captura de pantalla da táboa de datos que mostra un erro para o campo Recíproco para unha entrada de 0, que resulta nun erro de división por cero.

O cálculo en AddColumns atopou un erro de división por cero para un dos valores. Para ese rexistro, a columna Recíproco ten un valor de erro (división por cero), pero os outros rexistros non o teñen e están ben. IsError( Index( output, 2 ) ) devolve falso e IsError( Index( output, 2 ).Value ) devolve verdadeiro.

Se ocorre un erro ao filtrar unha táboa, todo o rexistro é un erro. A operación aínda devolve o rexistro no resultado para que o usuario final saiba que algo estaba alí e que hai un problema.

Siga este exemplo. Aquí, a táboa orixinal non ten erros, pero a filtraxe crea un erro sempre que Valor sexa igual a 0:

Captura de pantalla da táboa de datos que mostra erros para dous rexistros que non puideron ser procesados polos criterios do Filtro.

Os valores -5 e -3 están filtrados correctamente. Os valores 0 dan lugar a un erro ao procesar o filtro, polo que non está claro se o rexistro debe incluírse ou non no resultado. Para maximizar a transparencia para os usuarios finais e axudar aos fabricantes a depurar, a operación inclúe un rexistro de erro en lugar do orixinal. Neste caso, IsError( Index( output, 2 ) ) devolve verdadeiro.

Erros da orixe de datos

As funcións que modifican os datos nas orixes de datos, como erros de informes Parche, Collect, Eliminar, RemoveIf, Actualizar, UpdateIf e SubmitForm de dúas maneiras:

  • Cada unha destas funcións devolve un valor de erro como resultado da operación. Podes detectar erros usando IsError e substituír ou suprimir erros usando IfError e App.OnError como de costume.
  • Despois da operación, a función de Erros tamén devolve os erros das operacións anteriores. Este comportamento pode ser útil para mostrar a mensaxe de erro nunha pantalla de formulario sen necesidade de capturar o erro nunha variable de estado.

Por exemplo, esta fórmula comproba un erro en Collect e mostra unha mensaxe de erro personalizada:

IfError( Collect( Names, { Name: "duplicate" } ),
         Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )

A función Erros tamén devolve información sobre erros pasados durante as operacións de execución. Pode ser útil para mostrar un erro nunha pantalla de formulario sen necesidade de capturar o erro nunha variable de estado.

Volver lanzar erros

Ás veces esperas posibles erros e podes ignoralos con seguridade. Dentro de IfError e App.OnError, se se detecta un erro que debe pasarse ao seguinte manexador superior, relanzao usando Error( AllErrors ).

Creación dos seus propios erros

Tamén podes crear os teus propios erros usando a función de Erro .

Se creas os teus propios erros, usa valores superiores a 1.000 para evitar posibles conflitos con futuros valores de erro do sistema.

Valores de enumeración ErrorKind

Enumeración de ErrorKind Valor Descripción
AnalysisError 18 Erro do sistema. Hai un problema coa análise do compilador.
BadLanguageCode 14 Utilizouse un código de idioma non válido ou non recoñecido.
BadRegex 15 Expresión regular non válida. Comprobe a sintaxe utilizada coas funcións IsMatch, Match ou MatchAll.
Conflito 6 O rexistro que estás actualizando xa cambiou na fonte e necesitas resolver o conflito. Unha solución común é gardar os cambios locais, actualizar o rexistro e volver aplicar os cambios.
ConstraintViolated 8 O rexistro non pasou unha comprobación de restricións no servidor.
CreatePermission 3 Non tes permiso para crear un rexistro para a fonte de datos. Por exemplo, chamouse a función Collect.
DeletePermissions 5 Non tes permiso para eliminar un rexistro da fonte de datos. Por exemplo, chamouse a función Remove.
Div0 13 División por cero.
EditPermissions 4 Non tes permiso para crear un rexistro para a fonte de datos. Por exemplo, chamouse a función Patch.
GeneratedValue 9 Un valor foi pasado por erro ao servidor para un campo que o servidor calcula automaticamente.
InvalidFunctionUsage 16 Uso da función non válido. Moitas veces, un ou máis dos argumentos da función son incorrectos ou se usan dun xeito non válido.
FileNotFound 17 Non se puido atopar o almacenamento SaveData.
InsufficientMemory 21 Non hai memoria nin almacenamento suficiente no dispositivo para a operación.
InvalidArgument 25 Transmitiuse un argumento non válido a unha función.
Interna 26 Erro do sistema. Hai un problema interno cunha das funcións.
MissingRequired 2 Falta un campo obrigatorio dun rexistro.
Rede 23 Hai un problema coas comunicacións de rede.
Nada 0 Erro do sistema. Non hai ningún erro.
Non aplicable 27 Non hai ningún valor dispoñible. Este erro é útil para diferenciar un valor en branco que pode tratarse como cero en cálculos numéricos, dos valores en branco que deberían ser sinalados como un problema potencial se se usa ese valor.
NotFound 7 Non se atopou o rexistro. Por exemplo, o rexistro que se vai modificar na función Parche.
NotSupported 20 Operación non compatible con este reprodutor ou dispositivo.
Numérico 24 Utilizouse unha función numérica dun xeito impropio. Por exemplo, Sqrt con -1.
QuoteExceeded 22 Superouse a cota de almacenamento.
ReadOnlyValue 1,0 A columna é só de lectura e non se pode modificar.
ReadPermission 19 Non tes permiso para ler rexistros para a fonte de datos.
Sincronizar 1 A fonte de datos informou dun erro. Consulte a columna Mensaxe para obter máis información.
Descoñecido 12 Houbo un erro, pero dun tipo descoñecido.
Validación 11 O rexistro non pasou unha verificación de validación.