Funzioni Error, IfError, IsError, IsBlankOrError

Si applica a: app canvas colonne di formula Dataverse flussi desktop app basate su modello Power Platform CLI

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

Nota

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, in quanto 1/x produrrà 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 restituirà il valore di uno dei relativi argomenti. I tipi di tutti i valori che potrebbero essere restituiti da IfError devono essere compatibili.

Nell'ultimo esempio, Patch restituirà un record non compatibile con i booleani utilizzati per le formule Replacement o 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 verrà assegnato per corrispondere al tipo del primo argomento.

In Excel verrà visualizzato #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!" sarà assegnata al tipo del primo argomento di IfError, che è un numero. Il risultato di IfError sarà ancora un altro errore poiché la stringa di testo non può essere assegnata. 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 con FirstError come collegamento per il primo record di questa tabella. FirstError restituirà sempre lo stesso valore di First( AllErrors ).

I record di errore includono:

Campo Tipo Descrizione
Tipologia Enumerazione ErrorKind (numero) Categoria dell'errore.
Messaggio Stringa di testo Messaggio sull'errore, adatto per essere visualizzato all'utente finale.
Source Stringa di testo Posizione in cui ha avuto origine l'errore, utilizzata per la segnalazione. Ad esempio, una formula associata a una proprietà di controllo si trova nel modulo ControlName.PropertyName.
Osservato Stringa di testo Posizione in cui l'errore viene visualizzato all'utente, utilizzata per la segnalazione. Ad esempio, una formula associata a una proprietà di controllo si trova nel modulo ControlName.PropertyName.
Dettagli Record Dettagli sull'errore. Al momento, i dettagli vengono forniti 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à solo un errore con cui FirstError può sufficientemente lavorare. 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 impedirà 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, un valore vuoto è stato utilizzato per rappresentare sia i valori null dai database che 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.

Usando IsBlankOrError si 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

Error( ErrorRecord )
Error( ErrorTable )

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

IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )

  • Value(s): obbligatorio. Formula o formule in cui verificare la presenza di un valore di errore.
  • Replacement(s): 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( Value )
IsBlankOrError( Valore )

  • Value: obbligatorio. Formula da testare.

Esempi

IfError semplice

Formula Descrizione Risultato
IfError( 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
IfError( 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
IfError( 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
IfError( 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( "There was an internal problem" ) ) 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
IsError( 1 ) L'argomento non è un errore. falso
IsError( Blank() ) L'argomento è vuoto, ma non è un errore. falso
IsError( 1/0 ) L'argomento è un errore. vero
If( IsError( 1/0 ), Notify( "There was an internal problem" ) ) 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
IsBlankOrError( 1 ) L'argomento non è vuoto o un errore. falso
IsBlankOrError( Blank() ) L'argomento è vuoto. vero
IsBlankOrError( 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 sarà in uno stato di errore perché la funzione Value ha un argomento non valido. Poiché questo non è previsto dall'autore della formula, viene passato in modo che l'utente lo veda. Nel secondo caso, con la stessa formula, b avrà il 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 sappiamo che la divisione per zero non è un problema in un particolare contesto, gli errori possono 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 mostrerà il valore 1234, poiché si tratta di un input valido per la funzione Value.

  5. In TextInput1, immettere ToInfinity.

    Label1 mostrerà il valore -1, poiché non è un input valido per la funzione Value. 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

Informazioni di riferimento sulle formule per Power Apps