Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
El comportament descrit en aquest article només està disponible quan s'activa la funció de gestió d'errors a nivell de fórmula .
Power Fx admet la gestió d'errors a nivell de fórmula. Aquesta funció està activada per defecte per a totes les aplicacions noves. Tanmateix, algunes aplicacions antigues poden tenir-lo desactivat a la configuració de l'aplicació. Mantingues aquesta funció activada.
- Obre l'aplicació Canvas en mode edit.
- Ves a la pestanya Actualitzacions>>de la configuració Retirada.
- Assegura't que desactivar la gestió a nivell de fórmula estigui desactivada.
Per a més informació, vegeu Controlar quines funcions estan activades.
Es produeixen errors. Les xarxes s'emplenen, s'emplenen els valors inesperats. És important que la vostra lògica funcioni correctament davant de possibles problemes.
Per defecte, els errors flueixen per les fórmules d'una aplicació i s'informen a l'usuari final de l'aplicació. D'aquesta manera, l'usuari final sap que ha passat alguna cosa inesperada. Potencialment poden solucionar el problema ells mateixos amb una entrada diferent, o poden informar el problema al propietari de l'aplicació.
Com a creador d'aplicacions, controla els errors de la teva aplicació:
- Detectar i gestionar un error. Si hi ha la possibilitat que es produeixi un error, escriu les fórmules de l'aplicació per detectar la condició d'error i torna a intentar l'operació. L'usuari final no s'ha de tenir en compte que s'ha produït un error perquè el creador ha tingut en compte aquesta possibilitat. Captura l'error utilitzant les funcions IfError, IsError i IsErrorOrBlank dins d'una fórmula.
- Informa d'un error. Si un error no es gestiona a la fórmula on l'has trobat, l'error apareix al gestor d'App.OnError . No pots substituir l'error perquè ja ha passat i forma part dels càlculs de fórmules. Però podeu utilitzar l'App.OnError per controlar com s'informa l'error a l'usuari final, incloent-hi la supressió dels informes d'error conjuntament. App.OnError també proporciona un punt d'estrangulament comú per als informes d'errors a tota l'aplicació.
- Crea i torna a llançar un error. Finalment, pots detectar una condició d'error amb la teva pròpia lògica, una condició específica de la teva aplicació. Utilitzeu la funció Error per crear i notificar errors personalitzat. Utilitza la funció Error per tornar a llançar un error després d'haver estat interrogat a IfError o App.OnError.
Introducció
Comencem per un senzill exemple.
- Crea una nova pantalla en una aplicació de Power Apps Canvas.
- Inserir un control Entrada de text. Per defecte es diu TextInput1.
- Inseriu un control Etiqueta.
- Definiu la propietat Text del control Etiqueta a la fórmula
1/Value( TextInput1.Text )
Veus un error perquè el text per defecte d'un control TextInput és "Text input", que no es pot convertir en un número. Per defecte, això és positiu: l'usuari final rep una notificació que alguna cosa no funciona com s'espera a l'aplicació.
Òbviament, no vols que l'usuari reba un error cada vegada que iniciï aquesta aplicació. És probable "Text input" no sigui el valor per defecte correcte per al quadre d'entrada de text de totes maneres. Per solucionar aquest problema, canvia la propietat per defecte del control TextInput a:
Blank()
Hmm, ara veus un error diferent. Les operacions matemàtiques amb blanc, com la divisió, coaccionen el valor en blanc fins a zero. Aquest valor provoca una divisió per error zero. Per solucionar aquest problema, has de decidir quin és el comportament adequat per a aquesta situació en aquesta aplicació. La resposta podria ser mostrar en blanc quan l'entrada de text està en blanc. Pots aconseguir aquest objectiu embolicant la teva fórmula amb la funció IfError :
IfError( 1/Value( TextInput1.Text ), Blank() )
Ara l'error es substitueix per un valor vàlid i el banner d'error desapareix. Però, potser t'has passat, l'IfError que has utilitzat cobreix tots els errors, incloent-hi escriure un valor incorrecte com "hello". Pots solucionar aquest problema ajustant el teu IfError perquè gestioni la divisió només per cas zero i rellançant tots els altres errors:
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Així que, executa la teva aplicació i prova diferents valors.
Sense cap valor, com quan comença l'aplicació, no es mostrarà cap resposta mentre el valor per defecte està buit, però també no hi ha cap error que es mostri a l'IfError, ja que l'IfError substitueix la divisió per un error zero.
Si escrius un 4, obtindràs el resultat esperat de 0,25:
I si escrius alguna cosa il·legal, com hello, reps un bàner d'error:
Això és un exemple introductori senzill. Pots gestionar errors de moltes maneres diferents, depenent de les necessitats de l'aplicació:
- En lloc d'un bàner d'error, podries mostrar "#Error" al control de l'etiqueta amb la fórmula. Per mantenir els tipus de substitucions compatibles amb el primer argument d'IfError, cal convertir explícitament el resultat numèric en una cadena de text utilitzant la funció Text .
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- En lloc d'embolicar aquesta instància específica amb IfError, podries escriure un gestor centralitzat d'App.OnError . No pots substituir la cadena mostrada per "#Error" perquè l'error ja ha passat i App.OnError només es proporciona per controlar l'informe.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Propagació d'errors
Els errors des desplaçen per les fórmules de la mateixa manera que ho fan a l'Excel. Per exemple, a Excel, si la cel·la A1 té la fórmula =1/0, aleshores A1 mostra el valor #DIV0!d'error :
Si la cèl·lula A2 es refereix a A1 amb una fórmula com =A1*2, l'error es propaga també a través d'aquesta fórmula:
L'error substitueix el valor que la fórmula calcularia d'una altra manera. No hi ha cap resultat per a la multiplicació de la cel·la A2, només l'error de la divisió en A1.
Power Fx funciona de la mateixa manera. En general, si proporciones un error com a argument a una funció o operador, l'operació no es realitza. L'error d'entrada flueix com a resultat de l'operació. Per exemple, Mid( Text( 1/0 ), 1, 1 ) retorna un error de Divisió per Zero, ja que l'error més intern passa per la funció Text i la funció Mid :
En general, els errors no passen per les propietats de control de Power Apps. Ampliem l'exemple anterior amb un altre control que mostri si la propietat de Text la primera etiqueta és un estat d'error:
Està bé que els errors no es propaguin a través d'un control perquè el sistema observa errors a l'entrada de totes les propietats de control. L'error no està perdut.
La majoria de les funcions i els operadors segueixen la regla "error in, error out", però hi ha algunes excepcions. Les funcions IsError, IsErrorOrBlank i IfError estan dissenyades per treballar amb errors, així que potser no retornen cap error encara que se'ls passi un.
Observació d'errors
Power Fx no detecta errors fins que la fórmula utilitza el valor d'error.
Com a resultat, les funcions If i Select podrien no retornar cap error si se'n passa un. Considereu la fórmula If( false, 1/0, 3 ). Hi ha un error de divisió per zero en aquesta fórmula, però com que la funció If no pren aquesta branca a causa de la condició false, Power Fx i Power Apps no informen d'error:
Utilitzar la funció Set amb un error no informa d'un error en el moment en què l'error es col·loca a la variable. Per exemple, en Power Apps, aquí hi ha una fórmula a App.OnStart que posa una divisió per error zero a la variable x:
No s'ha informat cap error perquè no es fa referència a x. Tanmateix, en el moment que afegeixes un control d'etiqueta i configures la seva propietat Text a x, es mostra l'error:
Pots observar errors dins d'una fórmula utilitzant les funcions IfError, IsError i IsErrorOrBlank . Utilitzant aquestes funcions, pots retornar un valor alternatiu, prendre una acció alternativa o modificar l'error abans que sigui observat i reportat.
Informar d'errors
Després que Power Fx detecti un error, el següent pas és informar l'error a l'usuari final.
A diferència d'Excel, no sempre hi ha un lloc còmode per mostrar un resultat d'error, ja que el resultat d'una fórmula pot conduir una propietat com les coordenades X i Y d'un control per al qual no hi ha un lloc convenient per mostrar text. Cada amfitrió de Power Fx controla com es visualitzen finalment els errors a l'usuari final i el control del maker sobre aquest procés. A Power Apps, es mostra un bàner d'error i s'utilitza App.OnError per controlar com es reporta l'error.
És important tenir en compte que l'App.OnError no pot substituir l'error de la mateixa manera que l'IfError. En el moment en què s'executa App.OnError , l'error ja s'ha produït, i el resultat es propaga a través d'altres fórmules. App.OnError només controla com s'informa de l'error a l'usuari final i proporciona un ganxo perquè el creador registri l'error si ho desitja.
Les variables d'àmbit FirstError i AllErrors proporcionen informació de context sobre l'error o els errors. Aquest context proporciona informació sobre el tipus d'error, d'on s'ha originat l'error i on s'ha observat.
Aturada després d'un error
Les fórmules de comportament admeten l'acció, la modificació de bases de dades i l'estat de canvi. Aquestes fórmules permeten fer més d'una acció en una seqüència utilitzant l'operador ; de cadena (o ;; depenent de la localització).
En aquest cas, per exemple, el control de la graella mostra què hi ha a la T taula. Cada botó selecciona canvia l'estat d'aquesta taula amb dues trucades de pedaç:
En una fórmula de comportament desencadenada, les accions no s'aturen després del primer error. Modifiqueu el nostre exemple per passar un número d'índex no vàlid en la primera trucada de pedaç. El segon pedaç continua desesperat aquest error anterior. Es notifica el primer error a l'usuari final i es mostra com un error a Studio al control:
Utilitza IfError per aturar l'execució després d'un error. De manera semblant a la funció If, el tercer argument d'aquesta funció proporciona un lloc per posar accions que només s'han d'executar si no hi ha cap error:
Si es troba un error durant una de les iteracions de ForAll, la resta d'iteracions no s'aturen. ForAll està dissenyat per executar cada iteració de manera independent, permetent l'execució paral·. Quan el ForAll està complet, es retorna un error que conté tots els errors trobats (examinant AllErrors a IfError o App.OnError).
Per exemple, la fórmula següent fa que ForAll retorni dos errors (per a la divisió per zero de Value 0, dues vegades) i Collection té tres registres (per quan Value no és 0): [1, 2, 3].
Clear( Collection );
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );
Treballar amb diversos errors
Com que una fórmula de comportament pot executar més d'una acció, també pot trobar-se amb més d'un error.
Per defecte, l'aplicació informa del primer error a l'usuari final. En aquest exemple, ambdues crides a Patch fallen, però la segona crida falla amb un error de divisió per zero. L'usuari només veu el primer error sobre l'índex:
La funció IfError i App.OnError poden accedir a tots els errors trobats utilitzant la variable d'abast AllErrors . En aquest cas, pots establir aquesta variable com a variable global i mirar ambdós errors trobats. Apareixen a la taula en el mateix ordre en el qual s'han trobat:
Les fórmules de no-comportament també poden retornar múltiples errors. Per exemple, utilitzar la funció Pedaç amb un lot de registres per actualitzar pot retornar diversos errors, un per a cada registre que falla.
Errors a les taules
Com has vist abans, pots emmagatzemar errors en variables. També pots incloure errors en estructures de dades, com ara taules. Aquest enfocament és important perquè assegura que un error en cap registre no pot invalidar tota la taula.
Per exemple, considereu aquest control de taula de dades a Power Apps:
El càlcul a AddColumns va trobar un error de divisió per zero per a un dels valors. Per a aquest registre, la columna Reciprocal té un valor d'error (divisió per zero), però els altres registres no estan bé.
IsError( Index( output, 2 ) ) retorna false i IsError( Index( output, 2 ).Value ) retorna true.
Si es produeix un error en filtrar una taula, tot el registre és un error. L'operació encara retorna el registre al resultat perquè l'usuari final sàpiga que hi havia alguna cosa i que hi ha un problema.
Utilitzeu aquest exemple. Aquí, la taula original no té errors, però l'acte de filtratge crea un error cada vegada que Valor és igual a 0:
Els valors -5 i -3 estan correctament filtrats. Els valors 0 generen un error en processar el filtre i, per tant, no està clar si el registre s'ha d'incloure o no en el resultat. Per maximitzar la transparència dels usuaris finals i ajudar els fabricants a depurar, l'operació inclou un registre d'error en lloc de l'original. En aquest cas, IsError( Index( output, 2 ) ) es torna cert.
Errors de la font de dades
Les funcions que modifiquen dades a les fonts de dades, Patch, Collect, Remove, RemoveIf, Update, UpdateIf i SubmitForm informen d'errors de dues maneres:
- Cadascuna d'aquestes funcions retorna un valor d'error com a resultat de l'operació. Pots detectar errors utilitzant IsError i substituir o suprimir errors utilitzant IfError i App.OnError com de costum.
- Després de l'operació, la funció Errors també retorna els errors d'operacions anteriors. Aquest comportament pot ser útil per mostrar el missatge d'error en una pantalla de formulari sense necessitat de capturar l'error en una variable d'estat.
Per exemple, aquesta fórmula comprova un error de Collect i mostra un missatge d'error personalitzat:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
La funció Errors també retorna informació sobre els errors anteriors durant les operacions de temps d'execució. Pot ser útil per visualitzar un missatge d'error en una pantalla de formulari sense haver de captar l'error en una variable d'estat.
Recreació d'errors
De vegades esperes possibles errors i pots ignorar-los amb seguretat. Dins d'IfError i App.OnError, si es detecta un error que s'hauria de passar al gestor superior següent, rellança'l utilitzant Error( AllErrors ).
Creació d'errors propis
També pots crear els teus propis errors utilitzant la funció Error .
Si crees els teus propis errors, utilitza valors superiors a 1.000 per evitar possibles conflictes amb futurs valors d'error del sistema.
Valors d'enumerats d'ErrorKind
| Enumumeració d'ErrorKind | Valor | Descripció |
|---|---|---|
| AnalysisError | 18 | Error del sistema. Hi ha un problema amb l'anàlisi del compilador. |
| BadLanguageCode | 14 | S'ha utilitzat un codi de llengua no vàlid o no reconegut. |
| BadRegex | 15 | L'expressió regular no és vàlida. Comproveu la sintaxi utilitzada amb les funcions IsMatch, Match o MatchAll. |
| Conflicte | 6 | El registre que estàs actualitzant ja està canviat a l'origen i has de resoldre el conflicte. Una solució comuna és desar els canvis locals, actualitzar el registre i tornar a aplicar els canvis. |
| ConstraintViolated | 8 | El registre no ha superat una comprovació de restricció al servidor. |
| CreatePermission | 3 | No tens permís per crear un registre per a la font de dades. Per exemple, es va cridar la funció Collect. |
| DeletePermissions | 5 | No tens permís per eliminar un registre de la font de dades. Per exemple, es va cridar la funció Remove. |
| Div0 | 13 | Divisió entre zero. |
| EditPermissions | 4 | No tens permís per crear un registre per a la font de dades. Per exemple, es va cridar la funció Patch. |
| GeneratedValue | 9 | Un valor es va passar erròniament al servidor per a un camp que el servidor calcula automàticament. |
| InvalidFunctionUsage | 16 | Ús d'una funció no vàlid. Sovint, un o més dels arguments de la funció és incorrecte o s'utilitza de manera no vàlida. |
| FileNotFound | 17 | No s'ha trobat l'emmagatzematge SaveData. |
| InsufficientMemory | 21 | No hi ha prou memòria ni emmagatzematge al dispositiu per a l'operació. |
| InvalidArgument | 25 | S'ha passat un argument no vàlid a una funció. |
| Intern | 26 | Error del sistema. Hi ha un problema intern amb una de les funcions. |
| MissingRequired | 2 | Falta un camp obligatori d'un registre. |
| Xarxa | 23 | Hi ha un problema amb les comunicacions de xarxa. |
| cap | 0 | Error del sistema. No hi ha cap error. |
| No aplicable | 27 | No hi ha cap valor disponible. Aquest error és útil per diferenciar un valor en blanc que es pot tractar com a zero en càlculs numèrics, dels valors en blanc que s'haurien de marcar com a problema potencial si s'utilitza aquest valor. |
| NotFound | 7 | No s'ha pogut trobar el registre. Per exemple, el registre que s'ha de modificar a la funció Patch. |
| NotSupported | 20 | Aquest reproductor o dispositiu no admet aquesta operació. |
| Numèric | 24 | Una funció numèrica s'utilitzava de manera impròpia. Per exemple, Sqrt amb -1. |
| QuoteExceeded | 22 | S'ha superat la quota d'emmagatzematge. |
| ReadOnlyValue | 10 | La columna és només de lectura i no es pot modificar. |
| ReadPermission | 19 | No tens permís per llegir registres per a la font de dades. |
| Sincronitza | 1 | La font de dades ha informat d'un error. Per obtenir més informació, consulteu la columna Missatge. |
| Desconegut | 12 | S'ha produït un error, però d'un tipus desconegut. |
| Validació | 11 | El registre no ha superat una comprovació de validació. |