Condividi tramite


Funzioni Error, IfError, IsError, IsBlankOrError

Si applica a: App Canvas Dataverse Colonne formula Flussi Desktop App basate su modello Power Pages Power Platform CLI

Rilevano gli errori e forniscono un valore alternativo o eseguono un'azione. Creano un errore personalizzato o passano un errore.

Nota

Se un'app ha disattivato la funzionalità Gestione degli errori a livello di formula in Impostazioni>Aggiornamenti>Ritirati, tali funzioni non funzioneranno correttamente.

IfError

La funzione IfError testa i valori fino a quando non trova un errore. Se la funzione rileva un errore, valuta e restituisce un valore di sostituzione corrispondente e interrompe l'ulteriore valutazione. Un valore predefinito può anche essere fornito quando non vengono rilevati errori. La struttura di IfError è simile a quella della funzione If: IfError verifica la presenza di errori, mentre If verifica se sono true.

Utilizzare IfError per sostituire un errore con un valore valido di modo che i calcoli downstream possano continuare. Ad esempio, utilizzare questa funzione se l'input dell'utente potrebbe comportare una divisione per zero:

IfError( 1/x, 0 )

Questa formula restituisce 0 se il valore di x è zero, poiché 1/x produce un errore. Se x non è zero, viene restituito 1/x.

Interrompere un'ulteriore elaborazione

Quando si concatenano formule in formule di comportamento, ad esempio:

Patch( DS1, ... );
Patch( DS2, ... )

Verrà tentata la seconda funzione Patch per DS2 anche se Patch per DS1 non riesce. L'ambito di un errore è limitato a ciascuna formula concatenata.

Uilizzare IfError per eseguire un'azione e continuare l'elaborazione solo se l'azione ha avuto esito positivo. Applicando IfError a questo esempio:

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" ),
    Patch( DS2, ... ), Notify( "problem in the second action" )
)

Se Patch di DS1 ha un problema, viene eseguito il primo Notify. Non si verifica un'ulteriore elaborazione incluso il secondo Patch di DS2. Se il primo Patch riesce, verrà eseguito il secondo Patch.

Se fornito, l'argomento facoltativo DefaultResult viene restituito se non vengono rilevati errori. Senza questo argomento, viene restituito l'ultimo argomento Value.

Sulla base dell'ultimo esempio, il valore restituito da IfError può essere verificato per determinare se ci sono stati problemi:

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" );  false,
    Patch( DS2, ... ), Notify( "problem in the second action" ); false,
    true
)

Compatibilità del tipo

IfError restituisce il valore di uno dei suoi argomenti. I tipi di tutti i valori che potrebbero essere restituiti da IfError devono essere compatibili.

Nell'ultimo esempio, Patch restituisce un record che non è compatibile con i valori booleani utilizzati per le formule Replacement o per DefaultResult. Il che va bene, dal momento che non c'è una situazione in cui il valore restituito da queste chiamate Patch verrebbe restituito da IfError.

Nota

Durante il comportamento in corso per una modifica, i tipi di tutti gli argomenti di IfError devono essere attualmente compatibili.

Nel semplice esempio descritto in precedenza:

IfError( 1/x, 0 )

I tipi di 1/x e 0 erano compatibili in quanto entrambi erano numeri. In caso contrario, il secondo argomento viene forzato a corrispondere al tipo del primo argomento.

Excel visualizza #DIV/0! quando si verifica una divisione per zero.

Prendiamo invece in considerazione IfError con quanto segue:

IfError( 1/x, "#DIV/0!" )

La formula sopra non funzionerà. La stringa di testo "#DIV/0!" viene forzata al tipo del primo argomento di IfError, che è un numero. Il risultato di IfError è un altro errore poiché la stringa di testo non può essere forzata. Come soluzione, convertire il primo argomento in una stringa di testo di modo che IfErrorrestituisca sempre una stringa di testo:

IfError( Text( 1/x ), "#DIV/0!" )

Come visto sopra, IfError può restituire un errore se Replacement or DefaultResult è un errore.

FirstError / AllErrors

All'interno delle formule di sostituzione, le informazioni sugli errori riscontrati sono disponibili tramite il record FirstError e la tabella AllErrors. AllErrors è una tabella di record di informazioni sugli errori, dove FirstError è un collegamento al primo record di questa tabella. FirstError restituisce sempre lo stesso valore di First( AllErrors ).

I record di errore includono:

Campo Tipo Descrizione
Tipo Enumerazione ErrorKind (numero) Categoria dell'errore.
Messaggio Stringa di testo Messaggio sull'errore, adatto per essere visualizzato all'utente finale.
Fonte Stringa di testo Posizione in cui ha avuto origine l'errore, utilizzata per la segnalazione. Ad esempio, per una formula associata a una proprietà di controllo, questo valore è nel formato NomeControllo.NomeProprietà.
Osservato Stringa di testo Posizione in cui l'errore viene visualizzato all'utente, utilizzata per la segnalazione. Ad esempio, per una formula associata a una proprietà di controllo, questo valore è nel formato NomeControllo.NomeProprietà.
Dettagli Registra Dettagli sull'errore. Attualmente vengono forniti dettagli solo per gli errori di rete. Questo record include HttpStatusCode che contiene il codice di stato HTTP e HTTPResponse che contiene il corpo della risposta dal connettore o dal servizio.

Ad esempio, consideriamo la seguente formula come proprietà OnSelect del controllo Button:

Set( a, 1/0 )

E questa formula nella proprietà OnSelect di un secondo controllo Button:

IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )

La formula di esempio sopra mostrerebbe il seguente banner quando i due pulsanti vengono attivati in sequenza:

Controllo Button attivato, che mostra una notifica dalla funzione Notify.

In genere, ci sarà un solo errore con cui FirstError potrà funzionare in modo adeguato. Tuttavia, esistono scenari in cui possono essere restituiti più errori. Ad esempio, quando si utilizza un operatore di concatenamento formule o la funzione Concurrent. Anche in queste situazioni, la segnalazione FirstError potrebbe essere sufficiente per rivelare un problema invece di sovraccaricare un utente con più errori. Se hai ancora la necessità di lavorare con ogni errore individualmente, puoi utilizzare la tabella AllErrors.

IsError

La funzione IsError verifica la presenza di un valore di errore.

Viene restituito un valore booleano true o false.

L'utilizzo di IsError impedisce qualsiasi ulteriore elaborazione dell'errore.

IsBlankOrError

La funzione IsBlankOrError verifica la presenza di un valore vuoto o un valore di errore ed è l'equivalente di Or( IsBlank( X ), IsError( X ) ).

Quando si abilita la gestione degli errori per le app esistenti, considera la sostituzione di IsBlank con IsBlankOrError per preservare il comportamento dell'app esistente. Prima dell'aggiunta della gestione degli errori, veniva utilizzato un valore blank per rappresentare sia i valori nulli provenienti dai database sia i valori di errore. La gestione degli errori separa queste due interpretazioni di vuoto che potrebbe modificare il comportamento delle app esistenti che continuano a utilizzare IsBlank.

Viene restituito un valore booleano true o false.

L'utilizzo di IsBlankOrError impedisce qualsiasi ulteriore elaborazione dell'errore.

Usa la funzione Error per creare e segnalare un errore personalizzato. Ad esempio, potresti avere una logica per determinare se un valore è valido o meno per il tuo contesto, qualcosa in cui non è stata effettata automaticamente la ricerca di un problema. Puoi creare e restituire il tuo errore, completo di Tipologia e Messaggio, utilizzando lo stesso record sopra descritto per la funzione IfError.

Nel contesto di IfError, usa la funzione Error per rigenerare o eseguire il pass-through di un errore. Ad esempio, la tua logica in IfError può decidere che in alcuni casi un errore può essere tranquillamente ignorato, ma in altri casi l'errore è importante da inviare. In IfError o App.OnError, usa Error( FirstError ) per eseguire il pass-through di un errore.

La funzione Error può anche essere passata a una tabella di errori, come si troverebbe nella tabella AllErrors. Usa Error( AllErrors ) per rigenerare tutti gli errori e non solo il primo.

Un record vuoto o tabella vuota passata a Error non restituisce errori.

Sintassi

Errore( ErrorRecord )
Errore( TabellaErrori )

  • ErrorRecord – Obbligatorio. Record di informazioni sull'errore, incluso Tipologia, Messaggio e altri campi. Il tipo è obbligatorio. FirstError può essere passato direttamente.
  • ErrorTable – Obbligatorio. Tabella dei record di informazioni sugli errori. AllErrors può essere passato direttamente.

SeErrore( Valore1, Sostituzione1 [, Valore2 , Sostituzione2, ... [, Risultato predefinito ] ] )

  • Valori – Obbligatorio. Formula o formule in cui verificare la presenza di un valore di errore.
  • Sostituzioni – Obbligatorio. Formule da valutare e valori da restituire se gli argomenti Value corrispondenti hanno restituito un errore.
  • DefaultResult – Facoltativo. Le formule da valutare se la formula non trova errori.

IsError( Valore )
IsBlankOrError( Valore )

  • Valore – Obbligatorio. Formula da testare.

Esempi

IfError semplice

Formula Descrizione Risultato
SeErrore( 1, 2 ) Il primo argomento non è un errore. La funzione non ha altri errori da controllare e nessun valore restituito predefinito. La funzione restituisce l'ultimo argomento Value valutato. 1
SeErrore( 1/0, 2 ) Il primo argomento restituisce un valore di errore, a causa della divisione per zero. La funzione valuta il secondo argomento e lo restituisce come risultato. 2
SeErrore( 10, 20, 30 ) Il primo argomento non è un errore. La funzione non ha altri errori da controllare ma ha un valore restituito predefinito. La funzione restituisce l'argomento DefaultResult. 30
SeErrore( 10, 11, 20, 21, 300 ) Il primo argomento 10 non è un errore, quindi la funzione non valuta la sostituzione corrispondente 11 di quell'argomento. Neanche il terzo argomento 20 è un errore, quindi la funzione non valuta la sostituzione corrispondente 21 di quell'argomento. Il quinto argomento 300 non ha una sostituzione corrispondente ed è il risultato predefinito. La funzione restituisce quel risultato perché la formula non contiene errori. 300
IfError( 1/0, Notify( "Si è verificato un problema interno") Il primo argomento restituisce un valore di errore, a causa della divisione per zero. La funzione valuta il secondo argomento e visualizza un messaggio all'utente. Il valore restituito di IfError è il valore restituito di Notify, assegnato allo stesso tipo del primo argomento di IfError (un numero). 1

IfError semplice

Formula Descrizione Risultato
ÈErrore( 1 ) L'argomento non è un errore. falso
ÈErrore(Blank()) L'argomento è vuoto, ma non è un errore. falso
ÈErrore( 1/0 ) L'argomento è un errore. VERO
If( IsError( 1/0 ), Notify( "Si è verificato un problema interno") L'argomento di IsError restituisce un valore di errore, a causa della divisione per zero. Questa funzione restituisce true per cui If visualizza un messaggio all'utente con la funzione Notify. Il valore restituito di If è il valore restituito di Notify, assegnato allo stesso tipo del primo argomento di If (un booleano). VERO

IsBlankOrError semplice

Formula Descrizione Risultato
È vuoto o è un errore (1) L'argomento non è vuoto o un errore. falso
IsBlankOrError( Blank() ) L'argomento è vuoto. VERO
È vuoto o è un errore (1/0) L'argomento è un errore. VERO

Errore semplice

In questo esempio, le date vengono convalidate l'una rispetto all'altra, generando un errore in caso di problemi.

If( StartDate > EndDate,
    Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )

In questo esempio alcuni errori possono passare mentre altri vengono soppressi e sostituiti con un valore. Nel primo caso, b si trova in uno stato di errore perché la funzione Value ha un argomento non valido. Poiché ciò non è previsto da chi ha scritto la formula, viene trasmesso in modo che l'utente lo veda. Nel secondo caso, con la stessa formula, b ha valore 0, risultando in una divisione per zero. In questo caso, l'autore della formula può sapere che è accettabile per questa logica, sopprime l'errore (non viene visualizzato alcun banner) e restituisce -1.

With( {a: 1, b: Value("a")},
      IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns an error with Kind = ErrorKind.InvalidArgument

With( {a: 1, b: 0} )
      IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns -1

La tabella AllErrors può essere filtrata come qualsiasi altra tabella. Usata con la funzione Error, gli errori previsti possono essere rimossi e gli errori rimanenti conservati e segnalati. Ad esempio, se sapessimo che la divisione per zero non sarebbe un problema in un contesto particolare, quegli errori potrebbero essere filtrati, lasciando intatti tutti gli altri errori con la seguente formula:

Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )

Procedura dettagliata

  1. Aggiungi un controllo Text input e denominalo TextInput1 se non ha tale nome per impostazione predefinita.

  2. Aggiungere un controllo Label e denominarlo Label1 se non ha tale nome per impostazione predefinita.

  3. Impostare la formula per la proprietà Text di Label1 su:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. In TextInput1, immettere 1234.

    Label1 mostra il valore 1234 poiché si tratta di un input valido per la funzione Valore.

  5. In TextInput1, immettere ToInfinity.

    Label1 mostra il valore -1 poiché non si tratta di un input valido per la funzione Valore. Senza il wrapping della funzione Value con IfError, l'etichetta non mostrerebbe alcun valore perché il valore di errore viene considerato come blank.

Vedi anche

Riferimento alla formula per Power Apps