Condividi tramite


Error, IfError, IsError, funzioni IsBlankOrError

Functions Si applica a:
Error
IfError
IsError
App Canvas Copilot Studio Flussi desktop Colonne formula di Dataverse App basate su modello Funzioni powerverse dell'interfaccia della riga di comando di Power Platform Power Pages
IsBlankOrError App canvas Flussi desktop di Copilot Studio App basate su modello Funzioni power platform dell'interfaccia della riga di comando di Power Platform Power Pages

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 IfError funzione 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 Se verifica true.

Usare IfError per sostituire un errore con un valore valido in 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.

Usare IfError per eseguire un'azione e continuare l'elaborazione solo se l'azione ha avuto esito positivo. IfError Applicazione 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.

Basandosi sull'ultimo esempio, è possibile controllare il valore restituito da IfError per determinare se si sono verificati 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 relativi 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. Ciò è corretto, poiché non esiste alcuna situazione in cui il valore restituito da queste chiamate patch verrebbe restituito da IfError.

Nota

Mentre il comportamento in corso per una modifica, i tipi di tutti gli argomenti per 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.

Considerare IfError invece quanto segue:

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

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

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

Come illustrato in precedenza, IfError può restituire un errore se replacement o 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 ).

Error i record 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 IsError funzione verifica un valore di errore.

Viene restituito un valore booleano true o false.

L'uso IsError di impedisce un'ulteriore elaborazione dell'errore.

IsBlankOrError

La IsBlankOrError funzione verifica 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, è consigliabile sostituire IsBlank con IsBlankOrError per mantenere il comportamento esistente dell'app. 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. Error la gestione separa queste due interpretazioni di blank che potrebbero modificare il comportamento delle app esistenti che continuano a usare IsBlank.

Viene restituito un valore booleano true o false.

L'uso IsBlankOrError di impedisce un'ulteriore elaborazione dell'errore.

Usare la Error funzione 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. È possibile creare e restituire il proprio errore, completo di Kind e Message, usando lo stesso record descritto in precedenza per la IfError funzione.

Nel contesto di IfErrorusare la Error funzione per rigenerare o passare un errore. Ad esempio, la logica in IfError può decidere che in alcuni casi un errore può essere ignorato in modo sicuro, ma in altri casi l'errore è importante da inviare. In IfError o App.OnError usare Error( FirstError ) per passare un errore.

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

Un record vuoto o una tabella vuota passata a Error non genera alcun errore.

Sintassi

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord – Obbligatorio. Error record di informazioni, inclusi Kind, Message e altri campi. Il campo Kind è 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 ] ] )

  • 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

Semplice IfError

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( "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, coerced allo stesso tipo del primo argomento a IfError (un numero). 1

Semplice IsError

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" ) ) Argomento da IsError restituire 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

Semplice IsBlankOrError

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

Semplice Error

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 è in uno stato di errore perché il Valore la funzione 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, risultante 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. Usato con la Error funzione, gli errori previsti possono essere rimossi e gli errori rimanenti mantenuti 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 eseguire il wrapping della funzione Value con IfError, l'etichetta non mostrerà alcun valore perché il valore di errore viene considerato vuoto.

Vedi anche

Riferimento alla formula per Power Apps