Comparteix a través de


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.

  1. Crea una nova pantalla a l'aplicació de llenç de Power Apps.
  2. Inserir un control Entrada de text. Per defecte, es posarà en contacte amb el nom TextInput1.
  3. Inseriu un control Etiqueta.
  4. Definiu la propietat Text del control Etiqueta a la fórmula
1/Value( TextInput1.Text )

Bàner d'error que es mostra amb

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()

Bàner d'error que es mostra amb

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() )

No es mostra cap bàner d'error, s'ha substituït un error a causa d'un valor en blanc per un en blanc

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 ) ) )

No es mostra cap bàner d'error, s'ha substituït un error degut específicament a la divisió per zero per un en blanc, en cas contrari l'error es torna a llançar

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.

No es mostra cap resposta i no hi ha bàner d'error

Si escrivim en un 4, obtenim el resultat esperat de 0,25:

Es mostra 0.25 i no hi ha bàner d'error

I si escrivim alguna cosa de l'assemniment, hello rebrem un bànner d'error:

No es mostra cap valor i es mostra un bàner d'error per la impossibilitat de convertir

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ó:

  1. 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" )
    
    No hi ha bàner d'error i, en canvi#Error es mostra com a resultat
  2. 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!:

Full de càlcul Excel amb A1=1/0 i #DIV/0! mostrat a la cel·la

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é:

Full de càlcul Excel amb A2=A1*2 i #DIV/0! mostrat a la cel·la

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:

Bàner d'error que mostra un funcionament no vàlid: divisió per zero

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 es mostra cap error al segon control d'etiqueta

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:

No es mostra cap bàner d'error amb la funció If a la propietat Text de l'etiqueta

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 es mostra cap bàner d'error amb Defineix la trucada de funció a App.OnStart

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:

Bàner d'error que es mostra amb el control d'etiqueta que fa referència a la variable x

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ç:

Animació que mostra els dos registres de la taula T que s'actualitzen amb números aleatoris després de cada clic de botó

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:

Animació que mostra només el segon registre de la taula T que s'actualitza amb números aleatoris després de cada clic de botó, el primer registre resulta en un error

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:

Animació que no mostra cap canvi en cap dels registres de la taula T, perquè l'IfError impedeix que la segona operació es completi després d'un 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 Collectiontindrà 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:

Primer error d'índex que es mostra en un bàner d'error, el segon error no s'informa

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:

Captura dels errors en la variable global PatchErrors on podem veure que tots dos errors presenten

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:

Taula de dades que mostra un error per al camp Recíproc per a una entrada de 0, que resulta en una divisió per error zero

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:

Taula de dades que mostra errors per a dos registres que no s'han pogut processar segons els criteris de filtre

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ó.