Gestió d'errors
Nota
El comportament que es descriu en aquest article només està disponible si la característica en versió preliminar Administració d'errors al nivell de fórmula està activada a Configuració>Pròximes característiques>Versió preliminar. Més informació:Controlar les característiques habilitades
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 s'ha produït alguna cosa inesperada, que pot solucionar el problema amb una entrada diferent o bé notificar el problema al propietari de l'aplicació.
Com a desenvolupador d'aplicacions, podeu controlar els errors a l'aplicació:
- Detectar i administrar un error: Si és possible que es produeixi un error, les fórmules de l'aplicació es poden escriure per detectar la condició d'error i tornar 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. Això es fa amb les funcions IfError, IsError i IsErrorOrBlarden dins d'una fórmula.
- Informar d'un error: Si no es controla un error a la fórmula on es va trobar, l'error de bombolla al controlador App.OnError. Aquí, l'error ja no es pot substituir mentre ja s'ha produït 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 de picadí comú per als informes d'errors a tota l'aplicació.
- Crear i reparar un error: Finalment, podeu detectar una condició d'error amb la vostra pròpia lògica, una condició específica de l'aplicació. Utilitzeu la funció Error per crear i notificar errors personalitzat. La funció Error s'utilitza també per tornar a obtenir un error després d'haver-se interrogat a IfError o a l'App.OnError.
Introducció
Comencem per un senzill exemple.
- Crea una nova pantalla a l'aplicació de llenç de Power Apps.
- Inserir un control Entrada de text. Per defecte, es posarà en contacte amb el nom TextInput1.
- Inseriu un control Etiqueta.
- Definiu la propietat Text del control Etiqueta a la fórmula
1/Value( TextInput1.Text )
Hi ha un error perquè el text per defecte d'un control Entrada de text és "Text input"
, que no es pot convertir en un número. Per defecte, és una bona cosa: l'usuari final rebrà una notificació que alguna cosa no funciona com s'espera a l'aplicació.
Per fer-ho, no voleu que es produeixi un error cada vegada que inicien aquesta aplicació. És probable "Text input"
no sigui el valor per defecte correcte per al quadre d'entrada de text de totes maneres. Per arreglar-ho, cal canviar la propietat Per defecte del control Entrada de text a:
Blank()
Ara tenim un error diferent. Les operacions fasccionals amb un valor en blanc, com ara la divisió, coerciran el valor en blanc a un zero. I això està provocant una divisió per error zero. Per remenar-ho, hem de decidir quin és el comportament adequat per a aquesta situació en aquesta aplicació. La resposta pot ser que es mostrin en blanc quan l'entrada de text està en blanc. Això ho podem aconseguir ajustant la nostra fórmula amb la funció IfError :
IfError( 1/Value( TextInput1.Text ), Blank() )
Ara, l'error se substitueix per un valor vàlid i el banner d'error s'ha solucionat. Però, pot ser que ens trobem amb una instantània, l'IfError que hem utilitzat cobreix tots els errors, incloent-hi la introducció d'un valor incorrecte, com ara "hello"
. Per resoldre'l, hem d'ajustar el nostre IfError per gestionar la divisió per cas zero només amb i reprenent la resta d'errors:
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Per tant, executem la nostra aplicació i proveu alguns valors diferents.
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 escrivim en un 4, obtenim el resultat esperat de 0,25:
I si escrivim alguna cosa de l'assemniment, hello
rebrem un bànner d'error:
Això és un exemple introductori senzill. La gestió dels errors pot realitzar-se de moltes maneres diferents, en funció de les necessitats de l'aplicació:
- En comptes d'un bànner d'error, podríem haver mostrat "#Error" al control d'etiquetes amb la fórmula. Per mantenir els tipus de substitució compatibles amb el primer argument a IfError, hem de convertir explícitament el resultat numèric en una cadena de text amb la funció Text.
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- En comptes d'embolcallar aquesta instància específica amb IfError, podríem haver escrit controlador centralitzat App.onError. No podem substituir la cadena que es mostra per "#Error" quan l'error ja s'ha produït i l'App.OnError només es proporciona per controlar els informes.
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 l'Excel, si la cel·la A1
té la fórmula =1/0
, A1 mostrarà el valor d'error #DIV0!
:
Si la cel·la A2
fa referència a A1
amb una fórmula com =A1*2
, a continuació, l'error es propaga a través d'aquesta fórmula també:
L'error substitueix el valor que s'hauria calculat 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 es proporciona un error com a argument a una funció o operador, l'operació no es durà a terme i l'error d'entrada passarà per l'operació com a resultat de l'operació. Per exemple, Mid( Text( 1/0 ), 1, 1 )
retornarà un error de Divisió per zero, a mida que passa la majoria d'errors interns a través de la funció Text i la funció Mitjana:
En general, els errors no flueixen a través de les propietats de control de Power Apps. Ampliem l'exemple anterior amb un control addicional que es visualitza si la propietat de la primera etiqueta Text
és un estat d'error:
No passa res si els errors no es propaguen a través d'un control perquè el sistema observarà els errors a l'entrada a totes les propietats de control. L'error no es perdrà.
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, per la qual cosa poden no retornar un error encara que s'hagi passat a l'aplicació.
Observació d'errors
Els errors no s'observen fins que s'utilitza el seu valor.
Per aquest resultat, les funcions If i Select també poden no retornar un error si es passa. Considereu la fórmula If( false, 1/0, 3 )
. Hi ha un error de divisió per zero present en aquesta fórmula, però com que l'If
no està agafant aquesta branca a causa d'això , false
, Power Fx i Power Apps no s'informen dels errors:
L'ús de la funció Set amb un error no notifica un error quan l'error es col·loca a la variable. Per exemple, a Power Apps hi ha una fórmula a App.OnStart que col·loca un error de divisió per zero a la variable x
:
No s'ha informat cap error perquè no es fa referència a x
. Tanmateix, en el moment d'afegir un control d'etiqueta i establir la propietat Text a x
, es visualitza l'error:
Podeu veure errors dins d'una formula a les funcions IfError, IsError i IsErrorOrBlank. Amb aquestes funcions, podeu tornar un valor alternatiu, fer una acció alternativa o modificar l'error abans que es respecti i s'informi.
Informar d'errors
Després de detectar un error, el següent pas és notificar l'error a l'usuari final.
A diferència de l'Excel, no sempre hi ha un lloc convenient per mostrar un resultat d'error, ja que el resultat d'una fórmula pot conduir una propietat com ara les coordenades X i Y d'un control per al qual no hi ha cap lloc convenient per mostrar algun 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ànner d'error i l'App.OnError s'utilitza per controlar com s'informa 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è App.OnError s'ha executat, l'error ja s'ha produït i el resultat s'ha propagar a través d'altres fórmules. App.OnError només controla la manera com s'informa l'error a l'usuari final i proporciona un ganok perquè el responsable registre l'error si cal.
Les variables d'àmbit FirstError i AllErrors proporcionen informació de context sobre l'error o els errors. Això proporciona informació sobre la classe d'error i on es va originar l'error i on es va respectar.
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 mitjançant l'operador de transport ;
( ;;
o segons la ubicació regional).
En aquest cas, per exemple, el control de quadrícula mostra el que hi ha a la taula T
. 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:
L'IfError es pot utilitzar 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 produeix un error durant una de les iteracions de ForAll, la resta d'iteracions no s'aturarà. ForAll està dissenyat per executar cada iteració de manera independent, la qual es permet l'execució paral·lela. Quan ForAll estigui completat, es retornarà un error que contingui tots els errors detectats (examinant AllErrors a IfError o App.OnError).
Per exemple, la fórmula següent tindrà com a conseqüència ForAll que retorni dos errors (per a la divisió per zero per Value
per a 0, dues vegades) i Collection
tindrà tres registres ( Value
per quan no sigui 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, s'informa el primer error a l'usuari final. En aquest exemple, ambdues trucades a pedaços fallen, la segona amb una divisió per error zero. Només es mostra el primer error (quant a l'índex) a l'usuari:
La funció IfError i l'App.OnError poden accedir a tots els errors detectats amb la variable d'àmbit d'AllErrors. En aquest cas, podem definir-la en una variable global i veure els dos errors detectats. Apareixen a la taula en el mateix ordre en el qual s'han trobat:
També es poden retornar diversos errors a les fórmules que no són de comportament. 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 ja hem detectat abans, els errors es poden emmagatzemar en variables. Els errors també es poden incloure en estructures de dades, com ara taules. Això és important per tal que un error en qualsevol registre no pugui invalidar tota la taula.
Per exemple, tingueu en compte aquest control de taula de dades a Power Apps:
El càlcul a AddColumns ha trobat una divisió per error 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 ) )
torna fals i IsError( Index( output, 2 ).Value )
torna cert.
Si es produeix un error quan es filtra una taula, el registre sencer es mostra un error però es retorna en el resultat per tal que l'usuari final sàpiga que hi havia alguna cosa i 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 la depuració dels creadors d'ajuda, incloem 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 retornarà un valor d'error com a resultat de l'operació. Es poden detectar errors amb IsError i substituir-se o suprimir-se amb IfError i App.OnError com sempre.
- Després de l'operació, la funció Errors també retornarà els errors de les operacions anteriors. Això pot ser útil per visualitzar el missatge d'error en una pantalla de formulari sense haver de captar l'error en una variable d'estat.
Per exemple, aquesta fórmula comprovarà si hi ha un error a Collect i mostrarà 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 s'espera que hi hagi alguns errors potencials i es poden ignorar amb seguretat. A l'interior d'IfError i a l'App.OnError, si es detecta un error que s'ha de passar al següent controlador més alt, es podrà tornar a recollir Error( AllErrors )
.
Creació d'errors propis
També podeu crear errors propis amb la funció Error.
Si creeu els vostres propis errors, us recomanem que utilitzeu valors superiors a 1000 per evitar conflictes potencials amb valors d'error del sistema futurs.
Valors d'enumerats d'ErrorKind
Enumumeració d'ErrorKind | Valor | Descripció |
---|---|---|
AnalysisError | 18 | Error del sistema. Hi ha hagut un problema en l'anàlisi de compiladors. |
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 s'actualitza ja s'ha canviat a l'origen i cal 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 | L'usuari no té permisos per crear registres en aquesta font de dades. Per exemple, es va cridar la funció Collect. |
DeletePermissions | 5 | L'usuari no té permisos per suprimir registres en aquesta font de dades. Per exemple, es va cridar la funció Remove. |
Div0 | 13 | Divisió entre zero. |
EditPermissions | 4 | L'usuari no té permisos per crear registres en aquesta font de dades. Per exemple, es va cridar la funció Patch. |
GeneratedValue | 9 | S'ha passat un valor erròniament al servidor per a un camp calculat automàticament pel servidor. |
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 o 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 hagut un problema intern amb una de les funcions. |
MissingRequired | 2 | Faltava un camp obligatori d'un registre. |
Xarxa | 23 | Hi ha hagut un problema a les communicacions de la xarxa. |
cap | 0 | Error del sistema. No hi ha cap error. |
No aplicable | 27 | No hi ha cap valor disponible. Útil per diferenciar un valor en blanc que es pot tractar com a zero en càlculs numèrics a partir de valors en blanc que s'han de marcar com un possible problema si s'utilitza el 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 | L'usuari no té permisos per llegir registres en aquesta 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ó. |