Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
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.
- Abre a aplicación de canvas en modo edición.
- Vai á pestana de Actualizacións>> Retirada.
- 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.
- Crea unha nova pantalla nunha aplicación de Power Apps Canvas.
- Insira un control de TextInput. Por defecto chámase TextInput1.
- Insira o control Etiqueta.
- Axuste a propiedade Texto do control Etiqueta na fórmula.
1/Value( TextInput1.Text )
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()
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() )
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 ) ) )
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.
Se escribes un 4, obtés o resultado esperado de 0,25:
E se escribes algo ilegal, como hello, entón recibes un banner de erro:
Este é un exemplo introdutorio sinxelo. Podes xestionar erros de moitas maneiras diferentes, dependendo das necesidades da aplicación:
- 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" )
- 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 :
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:
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 :
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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. |