Compartir por


Tratamento de erros

Nota

O comportamento que describe este artigo está dispoñible só cando a característica de vista previa Xestión de erros a nivel de fórmula a través de Configuración>Próximas funcións>Vista previa está activada. Máis información: 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, pode solucionar o problema por si mesmo cunha entrada diferente ou pode informar do problema ao propietario da aplicación.

Como creador de aplicacións, pode controlar os erros da súa aplicación:

  • Detección e manexo de erros. Se existe a posibilidade de que se produza un erro, pódense escribir as fórmulas da aplicación para detectar a condición de erro e tentar 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. Isto faise coas funcións IfError, IsError e IsErrorOrBlank dentro dunha fórmula.
  • Informe dun erro. Se un erro non se xestiona na fórmula onde se atopou, o erro envíase ao controlador App.OnError. Aquí, o erro xa non se pode substituír xa que xa ocorreu e forma parte dos cálculos da fórmula. 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 ofrece un punto de estrangulamento común para informar de erros en toda a aplicación.
  • Crear e volver lanzar un erro. Finalmente, pode detectar unha condición de erro coa súa propia lóxica, unha condición específica da súa aplicación. Use a función Erro para crear erros personalizados. A función Erro tamén se utiliza para volver lanzar un erro tras ser interrogado en IfError ou App.OnError.

Introdución

Comecemos cun exemplo sinxelo.

  1. Cree unha pantalla nova nunha aplicación de lenzo Power Apps.
  2. Insira un control de TextInput. O nome predeterminado será TextInput1.
  3. Insira o control Etiqueta.
  4. Axuste a propiedade Texto do control Etiqueta na fórmula.
1/Value( TextInput1.Text )

Amosouse un banner de erro con

Temos un erro porque o texto predeterminado dun control TextInput é "Text input", o cal non se pode converter nun número. Por defecto, isto é bo: o usuario final recibirá unha notificación de que algo non funciona como se esperaba na aplicación.

Obviamente, non queremos que un erro saúde ao usuario 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 isto, cambiemos a propiedade Default do control TextInput a:

Blank()

Amosouse o banner de erro con

Umm, agora temos un erro diferente. As operacións matemáticas con blank, como a división, forzarán o valor en branco a un cero. E iso agora está a provocar un erro de división por cero. Para remediar isto, debemos decidir cal é o comportamento adecuado para esta situación nesta aplicación. A resposta pode ser mostrar blank cando a entrada de texto sexa blank. Podemos conseguilo envolvendo a nosa fórmula coa función IfError:

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

Non se amosou ningún banner de erro, substituíuse un erro debido a un valor en branco por un espazo en branco

Agora o erro substitúese por un valor válido e a faixa de erro desapareceu. Pero é posible que teñamos esquecido, o IfError que utilizamos cubre todos os erros, incluído escribir un valor incorrecto como "hello". Podemos solucionar isto axustando o noso IfError para xestionar a división por cero só con e volvendo lanzar todos os demais erros:

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

Non se amosa ningún banner de erro, substituíuse un erro debido específicamente á división por cero por un espazo en branco, se non, o erro volve lanzarse

Entón, executemos a nosa aplicación e probemos algúns 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.

Non se mostra ningunha resposta e non hai pancarta de erro

Se escribimos un 4, obtemos o resultado esperado de 0,25:

0.25 mostrado e ningún banner de erro

E se escribimos algo ilegal, como hello, recibiremos unha faixa de erro:

Non se mostra ningún valor e amosouse un banner de erro pola imposibilidade de converter

Este é un exemplo introdutorio sinxelo. O tratamento de erros pódese facer de moitas formas diferentes, dependendo das necesidades da aplicación:

  1. En lugar dunha faixa de erro, poderiamos ter mostrado "#Error" no control de etiqueta coa fórmula. Para manter os tipos de substitucións compatibles co primeiro argumento en IfError precisamos converter explicitamente o resultado numérico nunha cadea de texto coa función de Texto.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Ningún banner de erro e no seu lugar móstrase #Error como resultado
  2. En lugar de envolver esta instancia específica con IfError poderiamos ter escrito un controlador App.OnError centralizado. Non podemos substituír a cadea mostrada por "#Error" xa que 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, A1 amosará o valor de erro #DIV0!:

Folla de cálculo de Excel con A1=1/0 e #DIV/0! mostrado na cela

Se a cela A2 fai referencia a A1 cunha fórmula como =A1*2, o erro tamén se propaga a través desa fórmula:

Folla de cálculo de Excel con A2=A1*2 e #DIV/0! mostrado na cela

O erro substitúe o valor que se 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 se proporciona un erro como argumento para unha función ou operador, a operación non terá lugar e o erro de entrada fluirá como resultado da operación. Por exemplo, Mid( Text( 1/0 ), 1, 1 ) devolverá un erro División por cero, xa que o erro máis interno pasa pola función Texto e Mid:

O banner de erro mostra unha operación non válida: división por cero

En xeral, os erros non pasan polas propiedades de control de Power Apps. Ampliemos o exemplo anterior cun control adicional que mostra se a propiedade Text se atopa en estado de erro:

Non se mostra ningún erro no control da segunda etiqueta

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

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

Os erros non se observan ata que se utiliza o seu valor.

Como resultado, é posible que as funcións If e Select non devolvan un erro se se envía un. Considere a fórmula como If( false, 1/0, 3 ). Hai un erro de división por cero nesta fórmula, pero como o If non está tomando esa rama debido a false, Power Fx e Power Apps non informará dun erro:

Non se mostra ningún banner de erro coa función If na propiedade Texto da etiqueta

O uso da función Establecer cun erro non informará dun erro no punto no que se coloque o erro na variable. Por exemplo, en Power Apps, aquí ten unha fórmula en App.OnStart que coloca unha división por erro cero na variable x:

Non se mostra ningún banner de erro con Establecer chamada de función en App.OnStart

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

Móstrase un banner de erro co control de etiquetas que fai referencia á variable x

Pode observar erros nunha fórmula coas funcións IfError, IsError e IsErrorOrBlank. Con estas funcións, pode devolver un valor alternativo, realizar accións alternativas ou modificar o erro antes de que se observe e informe.

Denuncia de erros

Despois de observar un erro, o seguinte paso é informar do erro ao usuario final.

A diferenza de Excel, non sempre hai un lugar conveniente para mostrar un resultado de erro, xa que o resultado dunha fórmula pode dirixir unha propiedade como as coordenadas X e Y dun control para o que non hai un lugar conveniente para mostrar algún 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 unha faixa de erro e utilízase App.OnError para controlar como se informa do 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 propagouse a través doutras fórmulas. App.OnError só controla como se informa do erro ao usuario final e ofrece un gancho para que o fabricante rexistre o erro se o desexa.

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

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 mediante o operador de encadeamento ; (ou ;; dependendo da configuración rexional).

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

Animación que mostra os dous rexistros da táboa T que se actualizan con números aleatorios despois de cada clic no 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:

Animación que mostra só o segundo rexistro da táboa T que se actualiza con números aleatorios despois de cada clic no botón, o primeiro rexistro resulta nun erro

IfError pódese usar 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:

Animación que non mostra cambios en ningún dos rexistros da táboa T, porque o IfError impide 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 deterán. ForAll está deseñado para executar cada iteración de forma independente, permitindo a execución paralela. Cando se complete ForAll, devolverase un erro que contén todos os erros atopados (ao examinar AllErrors en IfError ou App.OnError).

Por exemplo, a seguinte fórmula dará lugar a que ForAll devolva dous erros (para a división entre cero de Value de 0, dúas veces) e Collection terá tres rexistros (para cando Value non sexa 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, o primeiro erro infórmase ao usuario final. Neste exemplo, ambas as chamadas de Parche fallarán, a segunda cun erro de división por cero. Só se mostra ao usuario o primeiro erro (sobre o índice):

O primeiro erro de índice aparece nun banner de erro, o segundo erro non se informa

A función IfError e App.OnError poden acceder a todos os erros atopados coa variable de ámbito AllErrors. Neste caso, podemos establecer isto nunha variable global e analizar os dous erros atopados. Aparecen na táboa na mesma orde na que se atoparon:

Captura dos erros na variable global PatchErrors onde podemos ver que ambos os erros presentan

Tamén se poden devolver varios erros en fórmulas sen comportamento. 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 vimos anteriormente, os erros pódense almacenar en variables. Tamén se poden incluír erros en estruturas de datos, como táboas. Isto é importante para que un erro nun rexistro non poida invalidar toda a táboa.

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

Táboa de datos que mostra un erro para o campo Recíproco para unha entrada de 0, o que dá lugar a un 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 se produce un erro ao filtrar unha táboa, o rexistro completo é un erro, pero aínda así se devolve no resultado para que o usuario final saiba que había algo 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:

Táboa de datos que amosa erros de dous rexistros que non se puideron procesar cos criterios de 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 creadores a depurar, incluímos un rexistro de erros 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 devolverá un valor de erro como resultado da operación. Os erros pódense detectar con IsError e substituírse ou eliminarse con IfError e App.OnError como de costume.
  • Despois da operación, a función Erros devolverá tamén os erros das operacións anteriores. Isto 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 comprobará se hai erros en Recoller e mostrará 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 espéranse algúns erros potenciais e pódense ignorar con seguridade. Dentro de IfError e App.OnError, se se detecta un erro, debe transmitirse ao seguinte controlador superior, pódese volver lanzar con Error( AllErrors ).

Creación dos seus propios erros

Tamén pode crear os seus propios erros coa función Erro.

Se está a crear os seus propios erros, recoméndase que utilice valores superiores a 1000 para evitar posibles conflitos cos valores futuros de erros do sistema.

Valores de enumeración ErrorKind

Enumeración de ErrorKind Valor Descripción
AnalysisError 18 Erro do sistema. Produciuse 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 se está actualizando xa se cambiou na orixe e hai que 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 O usuario non ten permiso para crear rexistros para a orixe de datos. Por exemplo, chamouse a función Collect.
DeletePermissions 5 O usuario non ten permiso para eliminar rexistros para a orixe de datos. Por exemplo, chamouse a función Remove.
Div0 13 División por cero.
EditPermissions 4 O usuario non ten permiso para crear rexistros para a orixe de datos. Por exemplo, chamouse a función Patch.
GeneratedValue 9 Pasouse un valor incorrectamente 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 suficiente memoria ou almacenamento no dispositivo para a operación.
InvalidArgument 25 Transmitiuse un argumento non válido a unha función.
Interna 26 Erro do sistema. Houbo un problema interno cunha das funcións.
MissingRequired 2 Faltaba un campo obrigatorio dun rexistro.
Rede 23 Produciuse 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. Útil para diferenciar un valor en branco que se pode tratar como un cero nos cálculos numéricos dos valores en branco que deberían marcarse como un problema potencial se se utiliza o 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 O usuario non ten permiso para ler rexistros para a orixe de datos.
Sincronizar 1 A orixe de datos denunciou un 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.