Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il comportamento descritto in questo articolo è disponibile solo quando la funzionalità di gestione degli errori a livello di formula è attivata.
Power Fx supporta la gestione degli errori a livello di formula. Questa funzionalità è attivata per impostazione predefinita per tutte le nuove app. Tuttavia, alcune app meno recenti potrebbero averla disattivata nelle impostazioni dell'app. Mantenere attivata questa funzionalità.
- Aprire l'app canvas in modalità di modifica.
- Passare alla scheda Impostazioni>Aggiornamenti>Archiviazione .
- Assicurarsi che Disabilita la gestione a livello di formula sia disattivata.
Per altre informazioni, vedere Controllo delle funzionalità abilitate.
Gli errori accadono. Le reti subiscono interruzioni, lo spazio di archiviazione si esaurisce e arrivano valori imprevisti. È importante che la logica continui a funzionare correttamente davanti a potenziali problemi.
Per impostazione predefinita, gli errori passano attraverso le formule di un'app e vengono segnalati all'utente finale dell'app. In questo modo, l'utente finale sa che è accaduto qualcosa di imprevisto. Possono potenzialmente risolvere il problema con un input diverso oppure segnalare il problema al proprietario dell'app.
In qualità di autore di app, assumere il controllo degli errori nell'app:
- Rilevare e gestire un errore. Se si verifica un errore, scrivere le formule dell'app per rilevare la condizione di errore e ripetere l'operazione. L'utente finale non deve preoccuparsi che si sia verificato un errore perché l'autore ha messo in conto la possibilità. Acquisire l'errore usando le funzioni IfError, IsError e IsErrorOrBlank all'interno di una formula.
- Segnalare un errore. Se un errore non viene gestito nella formula in cui è stato rilevato, l'errore viene passato al gestore App.OnError. Non è possibile sostituire l'errore perché si è già verificato e fa parte dei calcoli della formula. Tuttavia, puoi usare App.OnError per controllare il modo in cui l'errore viene segnalato all'utente finale, inclusa la soppressione totale della segnalazione dell'errore. App.OnError fornisce anche un punto centrale comune per la segnalazione degli errori nell'intera app.
- Creare e rigenerare un errore. Infine, è possibile rilevare una condizione di errore con la propria logica, una condizione specifica per l'app. Usa la funzione Error per creare errori personalizzati. Usare la funzione Error per rigenerare un errore dopo essere stato interrogato in IfError o App.OnError.
Introduzione
Iniziamo con un semplice esempio.
- Crea una nuova schermata in un'app Power Apps canvas.
- Inserisci un controllo TextInput. Viene impostato come TextInput1 per impostazione predefinita.
- Inserisci un controllo Label.
- Imposta la proprietà Text del controllo Label sulla formula
1/Value( TextInput1.Text )
Viene visualizzato un errore perché il testo predefinito di un controllo TextInput è "Text input", che non può essere convertito in un numero. Per impostazione predefinita, questo è un aspetto positivo: l'utente finale riceve una notifica che qualcosa non funziona come previsto nell'app.
Ovviamente, non vuoi che venga visualizzato un errore per salutare l'utente ogni volta che avvia questa app. Probabilmente, "Text input" non è l'impostazione predefinita corretta per la casella di immissione. Per risolvere il problema, modificare la proprietà Default del controllo TextInput in:
Blank()
Hmm, ora viene visualizzato un errore diverso. Le operazioni matematiche con valori vuoti, come la divisione, forzano il valore vuoto a zero. Questo valore causa un errore di divisione per zero. Per risolvere questo problema, è necessario decidere qual è il comportamento appropriato per questa situazione in questa app. La risposta potrebbe essere quella di mostrare vuota quando l'input di testo è vuoto. È possibile raggiungere questo obiettivo eseguendo il wrapping della formula con la funzione IfError :
IfError( 1/Value( TextInput1.Text ), Blank() )
Ora l'errore viene sostituito con un valore valido e il banner di errore viene eliminato. Tuttavia, è possibile che si sia verificato un salto e la funzione IfError utilizzata copre tutti gli errori, compresa la digitazione di un valore non valido, ad esempio "hello". È possibile risolvere questo problema ottimizzando IfError per gestire solo il caso di divisione per zero e rilanciare tutti gli altri errori.
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Eseguire quindi l'app e provare alcuni valori diversi.
Senza valori, ad esempio all'avvio dell'app, non viene visualizzata alcuna risposta poiché il valore predefinito è blank, ma non vengono visualizzati errori poiché IfError sostituisce l'errore di divisione per zero.
Se si digita un valore 4, si ottiene il risultato previsto di 0,25:
E se si digita qualcosa di non valido, ad esempio hello, viene visualizzato un banner di errore:
Questo è un semplice esempio introduttivo. È possibile gestire gli errori in molti modi diversi, a seconda delle esigenze dell'app:
- Anziché un banner di errore, è possibile visualizzare "#Error" nel controllo etichetta con la formula. Per mantenere compatibili i tipi delle sostituzioni con il primo argomento in IfError, è necessario convertire in modo esplicito il risultato numerico in una stringa di testo usando la funzione Text .
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- Anziché eseguire il wrapping di questa istanza specifica con IfError, è possibile scrivere un gestore App.OnError centralizzato. Non è possibile sostituire la stringa visualizzata con "#Error" perché l'errore si è già verificato e App.OnError viene fornito solo per controllare la segnalazione.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Propagazione degli errori
Gli errori passano attraverso le formule proprio come avviene in Excel. Ad esempio, in Excel, se la cella A1 contiene la formula =1/0, A1 visualizza il valore #DIV0!di errore :
Se la cella A2 fa riferimento a A1 con una formula come =A1*2, l'errore viene propagato anche tramite tale formula:
L'errore sostituisce il valore che la formula calcolerebbe in caso contrario. Non vi è alcun risultato per la moltiplicazione nella cella A2, solo l'errore della divisione in A1.
Power Fx funziona allo stesso modo. In generale, se si specifica un errore come argomento per una funzione o un operatore, l'operazione non viene eseguita. L'errore di input si propaga come risultato dell'operazione. Ad esempio, restituisce Mid( Text( 1/0 ), 1, 1 ) un errore Division by Zero, perché l'errore più interno passa attraverso la funzione Text e la funzione Mid :
In generale, gli errori non passano attraverso le proprietà di controllo di Power Apps. Estendiamo l'esempio precedente con un altro controllo per visualizzare se la proprietà della Text prima etichetta si trova in uno stato di errore.
È consigliabile che gli errori non vengano propagati tramite un controllo perché il sistema osserva errori nell'input per tutte le proprietà del controllo. L'errore non è andato perso.
La maggior parte delle funzioni e degli operatori segue la regola "errore in entrata, errore in uscita", ma ci sono alcune eccezioni. Le funzioni IsError, IsErrorOrBlank e IfError sono progettate per l'uso degli errori, pertanto potrebbero non restituire un errore anche se ne viene passato uno.
Osservazione degli errori
Power Fx non osserva gli errori finché la formula non usa il valore di errore.
Di conseguenza, le funzioni If e Select potrebbero non restituire un errore se ne viene passato uno. Considera la formula If( false, 1/0, 3 ). In questa formula è presente un errore di divisione per zero, ma poiché la If funzione non segue quel ramo a causa della false condizione, Power Fx e Power Apps non segnalano un errore:
L'uso della funzione Set con un errore non segnala un errore nel punto in cui l'errore viene inserito nella variabile. Ad esempio in Power Apps, ecco una formula in App.OnStart che inserisce un errore di divisione per zero nella variabile x:
Non viene segnalato alcun errore perché non si fa riferimento a x. Tuttavia, quando si aggiunge un controllo etichetta e si imposta la relativa proprietà Text su x, viene visualizzato l'errore:
È possibile osservare gli errori all'interno di una formula usando le funzioni IfError, IsError e IsErrorOrBlank . Usando queste funzioni, è possibile restituire un valore alternativo, eseguire un'azione alternativa o modificare l'errore prima che venga osservato e segnalato.
Segnalazione degli errori
Dopo che Power Fx osserva un errore, il passaggio successivo consiste nel segnalare l'errore all'utente finale.
A differenza di Excel, non c'è sempre una posizione comoda per visualizzare un risultato di errore, perché il risultato di una formula potrebbe guidare una proprietà come le coordinate X e Y di un controllo per cui non c'è posto comodo per mostrare del testo. Ogni host Power Fx controlla il modo in cui gli errori vengono mostrati all'utente finale e quanto controllo ha l'autore su questo processo. In Power Apps viene mostrato un banner di errore e App.OnError viene usato per controllare il modo in cui viene segnalato l'errore.
È importante notare che App.OnError non può sostituire l'errore nello stesso modo di IfError. Al momento dell'esecuzione di App.OnError , l'errore si è già verificato e il risultato viene propagato tramite altre formule. App.OnError controlla solo il modo in cui l'errore viene segnalato all'utente finale e fornisce un collegamento al produttore per registrare l'errore, se lo desidera.
Le variabili di ambito FirstError e AllErrors forniscono informazioni di contesto sull'errore o gli errori. Questo contesto fornisce informazioni sul tipo di errore, dove ha avuto origine l'errore e dove è stato osservato.
Interruzione dopo un errore
Le formule di comportamento supportano l'azione, la modifica di database e il cambiamento di stato. Queste formule consentono di eseguire più azioni in una sequenza usando l'operatore ; di concatenamento (o ;; a seconda delle impostazioni locali).
In questo caso, ad esempio, il controllo griglia mostra ciò che si trova nella T tabella. Ogni selezione di pulsante cambia lo stato in questa tabella con due chiamate Patch:
In una formula di comportamento concatenato, le azioni non si interrompono dopo il primo errore. Modifichiamo l'esempio per passare un numero di indice non valido nella prima chiamata Patch. La seconda Patch continua nonostante l'errore precedente. Il primo errore viene segnalato all'utente finale e mostrato come tale in Studio sul controllo:
Usare IfError per arrestare l'esecuzione dopo un errore. Analogamente alla funzione If, il terzo argomento di questa funzione fornisce un punto in cui inserire le azioni da eseguire solo se non si verificano errori:
Se si verifica un errore durante una delle iterazioni di ForAll, il resto delle iterazioni non si arresta. ForAll è progettato per eseguire ogni iterazione in modo indipendente, consentendo l'esecuzione parallela. Al termine di ForAll, viene generato un errore che contiene tutti gli errori riscontrati esaminando AllErrors in IfError o App.OnError.
Ad esempio, la formula seguente fa sì che ForAll restituisca due errori (per la divisione per zero di Value pari a 0, due volte) e Collection abbia tre record (quando Value non è 0): [1, 2, 3].
Clear( Collection );
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );
Lavorare con più errori
Poiché una formula di comportamento può eseguire più di un'azione, può anche rilevare più di un errore.
Per impostazione predefinita, l'app segnala il primo errore all'utente finale. In questo esempio entrambe le chiamate Patch hanno esito negativo, ma la seconda chiamata ha esito negativo con un errore divisione per zero. L'utente visualizza solo il primo errore relativo all'indice:
La funzione IfError e App.OnError possono accedere a tutti gli errori rilevati usando la variabile di ambito AllErrors . In questo caso, è possibile impostare questa variabile su una variabile globale ed esaminare entrambi gli errori rilevati. Appaiono nella tabella nello stesso ordine in cui sono stati rilevati:
Le formule non comportamentali possono restituire anche più errori. Ad esempio, l'uso della funzione Patch con un batch di record da aggiornare può restituire più errori, uno per ogni record non riuscito.
Errori nelle tabelle
Come illustrato in precedenza, è possibile archiviare gli errori nelle variabili. È anche possibile includere errori nelle strutture di dati, ad esempio tabelle. Questo approccio è importante perché garantisce che un errore in un record non possa invalidare l'intera tabella.
Ad esempio, considera questo controllo tabella dati in Power Apps:
Il calcolo in AddColumns ha rilevato un errore di divisione per zero per uno dei valori. Per quel record, la colonna Reciprocal ha un valore di errore (divisione per zero), ma gli altri record no, pertanto sono corretti.
IsError( Index( output, 2 ) ) restituisce falso e IsError( Index( output, 2 ).Value ) restituisce vero.
Se si verifica un errore durante il filtro di una tabella, l'intero record è un errore. L'operazione restituisce comunque il record nel risultato affinché l'utente finale sappia che c'era qualcosa e ci sia stato un problema.
Usiamo questo esempio. Qui, la tabella originale non ha errori, ma l'azione di filtro crea un errore ogni volta che Value è uguale a 0:
I valori -5 e -3 sono filtrati correttamente. I valori 0 restituiscono un errore nell'elaborazione del filtro, pertanto non è chiaro se il record debba essere incluso o meno nel risultato. Per ottimizzare la trasparenza per gli utenti finali e aiutare i creatori a eseguire il debug, l'operazione include un record di errore al posto dell'originale. In questo caso, IsError( Index( output, 2 ) ) restituisce true.
Errori dell'origine dati
Le funzioni che modificano i dati nelle origini dati, ad esempio Patch, Collect, Remove, RemoveIf, Update, UpdateIf e SubmitForm segnalano gli errori in due modi:
- Ognuna di queste funzioni restituisce un valore di errore come risultato dell'operazione. È possibile rilevare gli errori usando IsError e sostituire o eliminare gli errori usando IfError e App.OnError come di consueto.
- Dopo l'operazione, la funzione Errors restituisce anche gli errori per le operazioni precedenti. Questo comportamento può essere utile per visualizzare il messaggio di errore in una schermata del modulo senza dover acquisire l'errore in una variabile di stato.
Ad esempio, questa formula verifica la presenza di un errore da Collect e visualizza un messaggio di errore personalizzato:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
La funzione Errors restituisce anche informazioni sugli errori passati durante le operazioni di runtime. Può essere utile per visualizzare un errore su una schermata modulo senza la necessità di acquisire l'errore in una variabile di stato.
Rilancio degli errori
A volte si prevedono potenziali errori e possono essere ignorati in modo sicuro. All'interno di IfError e App.OnError, se viene rilevato un errore che deve essere passato al gestore di livello superiore, rilancialo usando Error( AllErrors ).
Creazione di propri errori
È anche possibile creare errori personalizzati usando la funzione Error .
Se si creano errori personalizzati, usare valori maggiori di 1.000 per evitare potenziali conflitti con i valori di errore di sistema futuri.
Valori enum di ErrorKind
| Enumerazione ErrorKind | Valore | Descrizione |
|---|---|---|
| Errore di analisi | 18 | Errore di sistema. Si è verificato un problema con l'analisi del compilatore. |
| BadLanguageCode | 14 | È stato usato un codice lingua non valido o non riconosciuto. |
| BadRegex | 15 | Espressione regolare non valida. Verifica la sintassi usata con le funzioni IsMatch, Match o MatchAll. |
| Conflitto | 6 | Il record che si sta aggiornando è già stato modificato nell'origine ed è necessario risolvere il conflitto. Una soluzione comune consiste nel salvare eventuali modifiche locali, aggiornare il record e riapplicare le modifiche. |
| VincoloViolato | 8 | Il record non ha superato un controllo di vincolo sul server. |
| CreatePermission | 3 | Non si dispone dell'autorizzazione per creare un record per l'origine dati. Ad esempio, è stata chiamata la funzione Collect. |
| EliminaPermessi | 5 | Non hai l'autorizzazione per eliminare un record dall'origine dati. Ad esempio, è stata chiamata la funzione Remove. |
| Div0 | 13 | Divisione per zero. |
| ModificaPermessi | 4 | Non si dispone dell'autorizzazione per creare un record per l'origine dati. Ad esempio, è stata chiamata la funzione Patch. |
| GeneratedValue | 9 | Un valore è stato erroneamente passato al server per un campo calcolato automaticamente dal server. |
| UtilizzoFunzioneNonValido | 16 | Utilizzo non valido di una funzione. Spesso uno o più argomenti della funzione non sono corretti o sono usati in modo non valido. |
| File Non Trovato | 17 | Impossibile trovare l'archiviazione SaveData. |
| MemoriaInsufficiente | 21 | Memoria o spazio di archiviazione insufficiente nel dispositivo per l'operazione. |
| ArgomentoNonValido | 25 | Un argomento non valido è stato passato a una funzione. |
| Interno | 26 | Errore di sistema. Si è verificato un problema interno con una delle funzioni. |
| ObbligatorioMancante | 2 | Manca un campo obbligatorio di un record. |
| Rete | 23 | C'è un problema con le comunicazioni di rete. |
| None | 0 | Errore di sistema. Nessun errore. |
| Non applicabile | 27 | Nessun valore disponibile. Questo errore è utile per distinguere un valore vuoto che può essere considerato zero nei calcoli numerici, da valori vuoti che devono essere contrassegnati come un potenziale problema se viene usato il valore. |
| Non Trovato | 7 | Impossibile trovare il record. Ad esempio, il record da modificare nella funzione Patch. |
| Non supportato | 20 | Operazione non supportata da questo dispositivo o lettore. |
| Numerico | 24 | Una funzione numerica è stata usata in modo improprio. Ad esempio, Sqrt con -1. |
| CitazioneSuperata | 22 | Quota archiviazione superata. |
| ReadOnlyValue | 10 | La colonna è di sola lettura e non può essere modificata. |
| Permesso di Lettura | 19 | Non si dispone dell'autorizzazione per leggere i record per l'origine dati. |
| Sincronizza | 1 | L'origine dati ha segnalato un errore. Controlla la colonna dei messaggi per altre informazioni. |
| Sconosciuto | 12 | Si è verificato un errore di tipo sconosciuto. |
| Validazione | 11 | Il record non ha superato un controllo di convalida. |