Funkcje Error, IfError, IsError, IsBlankOrError
Dotyczy: Kolumny z formułami Dataverse w aplikacjach kanwy Przepływy pulpitu Interfejs wiersza polecenia aplikacji Power Pages Power Platform opartych na modelu
Wykrywa błędy i podaje wartość alternatywną lub wykonuje działanie. Utwórz błąd niestandardowy lub pomiń błąd.
Uwaga
Jeśli aplikacja wyłączyła funkcję zarządzania błędami na poziomie formuły w obszarze Wycofane> aktualizacje>ustawień, te funkcje nie będą działać poprawnie.
IfError
Funkcja IfError sprawdza wartości, dopóki nie zostanie znaleziona błędna. Jeśli funkcja odnajdzie błąd, ocenia i zwraca wartość odpowiadające zastępstwo i zatrzymuje dalszą ocenę. W przypadku, gdy nie zostaną znalezione żadne błędy, można również podać wartość domyślną. Struktura IfError jest podobna do funkcji If – podczas gdy IfError testuje w poszukiwaniu błędów, funkcja If testuje w poszukiwaniu wartości true.
Użyj IfError, aby zamienić błąd na prawidłową wartość w celu kontynuowania obliczeń podrzędnych. Tej funkcji należy użyć na przykład wtedy, gdy wprowadzenie danych przez użytkownika może skutkować podziałem równym zero:
IfError( 1/x, 0 )
Ta formuła jest zwracana 0
, jeśli wartość wynosi x
zero, co 1/x
powoduje błąd. Jeśli x
nie jest równa zeru, jest zwracane 1/x
.
Zatrzymanie dalszego przetwarzania
Przy łańcuchu formuł w formułach zachowania, takich jak:
Patch( DS1, ... );
Patch( DS2, ... )
Druga funkcja Patch, która ma być poddana próbie DS2
, w sytuacji nieudanego przeprowadzenia Patch w DS1
. Zakres błędów jest ograniczony do każdej formuły, która jest uruchomiona w łańcuchu.
Korzystanie z funkcji IfError w celu wykonywania akcji i kontynuowania przetwarzania, jeśli działanie zakończyło się niepowodzeniem. Zastosowanie IfError do tego przykładu:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ),
Patch( DS2, ... ), Notify( "problem in the second action" )
)
Jeśli Patch napotkała problem w ramach DS1
, wykonane jest pierwsze Notify. Nie ma dalszego przetwarzania, w tym drugiej funkcji Patch dla DS2
. Jeśli pierwsza funkcja Patch powiedzie się, zostanie wykonana druga funkcja Patch.
Jeśli jest podany, opcjonalny argument DefaultResult zostanie zwrócony w przypadku braku błędów. Bez tego argumentu zwracana jest Wartość ostatniego argumentu.
Rozwijając ostatni przykład, wartość zwrotna funkcji IfError może być sprawdzona, aby ocenić, czy wystąpiły problemy:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ); false,
Patch( DS2, ... ), Notify( "problem in the second action" ); false,
true
)
Zgodność typów
Funkcja IfError zwraca wartość jednego ze swoich argumentów. Typy wszystkich wartości, które mogą zostać zwrócone przez składnik IfError muszą być zgodne.
W ostatnim przykładzie funkcja Patch zwraca rekord, który nie jest zgodny z wartościami logicznymi używanymi dla formuł Replacement lub DefaultResult. Nie jest to problem, ponieważ nie ma sytuacji, w której wartość zwrotna z tych wywołań funkcji Patch jest zwracana przez IfError.
Uwaga
Podczas zachowania podczas przetwarzania zmiany, typy wszystkich argumentów IfError muszą być obecnie zgodne.
W prostym przykładzie opisanym wcześniej:
IfError( 1/x, 0 )
Typy 1/x
i 0
były zgodne, ponieważ były to liczby. Jeśli tak nie jest, drugi argument jest wymuszany tak, aby pasował do typu pierwszego argumentu.
Wyświetlanie programu Excel#DIV/0! gdy następuje dzielenie przez zero.
Zamiast tego rozważmy IfError, podając następujący element:
IfError( 1/x, "#DIV/0!" )
Powyższa formuła nie zadziała. Ciąg "#DIV/0!"
tekstowy jest przekształcany w typ pierwszego argumentu na IfError, który jest liczbą. Wynikiem IfError jest kolejny błąd, ponieważ nie można przekonwertować ciągu tekstowego. W celu dokonania poprawki należy przekonwertować pierwszy argument na łańcuch tekstowy, tak aby IfError zawsze zwracał ciąg tekstowy:
IfError( Text( 1/x ), "#DIV/0!" )
Jak pokazano powyżej, program IfError może zwrócić błąd w przypadku, gdy funkcje Zastępcze lub DefaultResult powoduje wystąpienie błędu.
FirstError / AllErrors
W formułach zastępczych informacje o znalezionych błędach są dostępne za pośrednictwem rekordu FirstError i tabeli AllErrors. AllErrors to tabela rekordów informacji o błędach, przy czym FirstError jest skrótem do pierwszego rekordu tej tabeli. FirstError zawsze zwraca tę samą wartość co First( AllErrors ).
Rekordy błędów obejmują:
Pole | Typ | Opis |
---|---|---|
Rodzaj | Wyliczenie ErrorKind (liczba) | Kategoria błędu. |
Komunikat | Ciąg tekstowy | Komunikat o błędzie, który jest odpowiedni do wyświetlenia użytkownikowi końcowemu. |
Źródło | Ciąg tekstowy | Lokalizacja, w której pochodzi błąd, używana na przykład do raportowania. Na przykład w przypadku formuły powiązanej z właściwością formantu ta wartość ma postać NazwaKontrolki.NazwaWłaściwości. |
Obserwowane | Ciąg tekstowy | Lokalizacja, w której błąd został ujawniony użytkownikowi, używana do raportowania. Na przykład w przypadku formuły powiązanej z właściwością formantu ta wartość ma postać NazwaKontrolki.NazwaWłaściwości. |
Szczegóły | Nagraj | Szczegóły błędu. Obecnie szczegółowe informacje są udostępniane tylko w przypadku błędów sieciowych. Ten rekord zawiera HttpStatusCode, który zawiera kod stanu HTTP, oraz HttpResponse, który zawiera treść odpowiedzi z łącznika lub usługi. |
Można na przykład rozważyć użycie następującej formuły w kontrolce Button właściwości OnSelect:
Set( a, 1/0 )
I ta formuła na właściwości OnSelect drugiej kontrolki Button:
IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )
Powyższa formuła przykładowa wyświetli następujący baner, gdy dwa przyciski zostaną aktywowane kolejno:
Zazwyczaj będzie tylko jeden błąd, z którym FirstError może wystarczająco pracować. Zdarza się jednak, że może zostać zwróconych wiele błędów. Na przykład w przypadku używania operatora używania formuły do jednoczesnego używania lub funkcji Concurrent. Nawet w takiej sytuacji raportowanie FirstError może wystarczyć, aby znaleźć problem, a nie przeciążyć użytkownika wieloma błędami. Jeśli nadal występuje konieczność pracy z poszczególnymi błędami, można użyć tabeli AllErrors.
IsError
Funkcja IsError sprawdza poprawność wartości błędu.
Wartością zwracaną jest wartość logiczna true lub false.
Użycie IsError zapobiega dalszemu przetwarzaniu błędu.
IsBlankOrError
Funkcja IsBlankOrError sprawdza wartość pustą lub wartość błędu i jest odpowiednikiem wartości Or( IsBlank( X ), IsError( X ) )
.
Włączając obsługę błędów w istniejących aplikacjach, rozważ zastąpienie IsBlank z IsBlankOrError, aby zachować istniejące zachowanie aplikacji. Przed dodaniem obsługi błędów wartość pusta była używana do reprezentowania zarówno wartości null z baz danych, jak i wartości błędów. Obsługa błędów rozdziela te dwa rodzaje pustych danych, co może zmienić zachowanie istniejących aplikacji, które nadal korzystają z aplikacji IsBlank.
Wartością zwracaną jest wartość logiczna true lub false.
Użycie IsBlankOrError uniemożliwia dalsze przetwarzanie błędu.
Użyj funkcji Error do utworzenia i utworzenia raportu niestandardowego błędu. Na przykład możesz użyć logiki, aby określić, czy dana wartość jest prawidłowa w Twoim kontekście, czy nie — coś, co nie zostało automatycznie sprawdzone pod kątem problemu. Możesz utworzyć i zwrócić własny błąd, używając funkcji Rodzaj i Wiadomość, używając tego samego rekordu opisanego powyżej dla funkcji IfError.
W kontekście IfError można użyć funkcji Error do ponownego omyłki lub przejścia przez błąd. Na przykład logika w programie IfError może zdecydować, że w niektórych przypadkach można zignorować błąd, ale w innych przypadkach istotne jest jego wysłanie. W IfError lub App.OnError użyj Error( FirstError ) do przejścia przez błąd.
Do funkcji Error można też przekazać tabelę błędów, tak jak w tabeli AllErrors. Użyj Error( AllErrors ), aby ponownie zgłosić wszystkie błędy, a nie tylko pierwszy.
Pusty rekord lub pusta tabela przekazywana do Error nie powoduje błędu.
Składnia
Błąd( ErrorRecord )
Błąd( Tabela błędów)
- ErrorRecord – wymagane. Rekord informacji o błędzie, w tym Rodzaj, Wiadomość i inne pola. Rodzaj jest wymagany. FirstError można przekazać bezpośrednio.
- Tabela błędów– wymagane. Tabela rekordów informacji o błędach. AllErrors można przekazać bezpośrednio.
IfError(Wartość1,Zamiana1 [, Wartość2 ;Zamiana2 , ... [, Wynik_ domyślny] ] )
- Wartości – Wymagane. Co najmniej jedna formuła do testowania pod kątem wartości błędu.
- Zamienniki – Wymagane. Formuły, które mają zostać obliczone, i wartości, które mają zostać zwrócone, jeśli argumenty Wartość zwróciły błąd.
- DefaultResult – Opcjonalne. Formuły, które mają zostać oszacowane, jeśli w formule nie zostaną znalezione żadne błędy.
IsError( Wartość )
IsBlankOrError( wartość )
- Wartość – wymagane. Formułę do przetestowania.
Przykłady
Proste IfError
Formuła | Opis | Wynik |
---|---|---|
IfError( 1, 2 ) | Pierwszy argument nie jest błędem. Funkcja nie ma innych błędów do sprawdzenia i brak domyślnej wartości zwracanej. Funkcja zwraca wartość ostatniego z argumentów. | 1 |
IfError( 1/0, 2 ) | Pierwszy argument zwraca wartość błędu (z powodu dzielenia przez zero). Funkcja ocenia drugi argument i zwraca go w wyniku. | 2 |
IfError( 10, 20, 30 ) | Pierwszy argument nie jest błędem. Funkcja nie ma innych błędów do sprawdzenia ale istnieje domyślna wartość zwracana. Funkcja zwraca argument DefaultResult. | 30 |
IfError( 10, 11, 20, 21, 300 ) | Pierwszy argument 10 nie jest komunikatem o błędzie, więc funkcja nie daje w wyniku zamiany w tym argumencie odpowiedniego zastępstwa 11. Trzeci argument 20 także nie jest komunikatem o błędzie, więc funkcja nie daje w wyniku zamiany w tym argumencie odpowiedniego zastępstwa 21. Piąty argument 300 nie ma odpowiadającego mu zastępstwa i jest wynikiem domyślnym. Ta funkcja zwraca taki wynik, ponieważ formuła nie zawiera błędów. | 300 |
IfError( 1/0, Powiadom ( "Wystąpił problem wewnętrzny" ) ) | Pierwszy argument zwraca wartość błędu (z powodu dzielenia przez zero). Funkcja oblicza drugi argument, co powoduje wyświetlenie komunikatu dla użytkownika. Wartość zwracana przez funkcję IfError jest wartością zwracaną przez funkcję Notify, przekształconą na taki sam typ danych, jaki miał pierwszy argument funkcji IfError (liczba). | 1 |
Proste IsError
Wzór | Opis | Wynik |
---|---|---|
IsError( 1 ) | Pierwszy argument nie jest błędem. | fałszywy |
IsError( Puste() ) | Argument jest pusty, ale nie jest to błąd. | fałszywy |
IsError( 1/0 ) | Pierwszy argument jest błędem. | prawdziwy |
If( IsError( 1/0 ), Powiadom ( "Wystąpił problem wewnętrzny" ) ) | Argument IsError zwraca wartość błędu (z powodu dzielenia przez zero). Ta funkcja zwraca wartość true, co powoduje, że funkcja If wyświetla komunikat dla użytkownika za pomocą funkcji Notify. Wartość zwracana przez funkcję If jest wartością zwracaną przez funkcję Notify, przekształconą na taki sam typ danych, jaki miał pierwszy argument funkcji If (wartość logiczna). | prawdziwy |
Proste IsBlankOrError
Formuła | Opis | Wynik |
---|---|---|
IsBlankOrError( 1 ) | Argument nie jest błędem ani pusty. | fałszywy |
IsBlankOrError( Puste() ) | Argument jest pusty. | prawdziwy |
IsBlankOrError( 1/0 ) | Pierwszy argument jest błędem. | prawdziwy |
Prosty błąd
W tym przykładzie daty są sprawdzane względem siebie, co skutkuje błędem w przypadku wystąpienia problemu.
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
W tym przykładzie niektóre błędy mogą przejść, podczas gdy inne są pomijane i zastępowane wartością. W pierwszym przypadku b jest w stanie błędu, ponieważ funkcja Value ma nieprawidłowy argument. Ponieważ jest to nieoczekiwane przez autora formuły, jest przekazywane, aby użytkownik mógł je zobaczyć. W drugim przypadku, przy tej samej formule, b ma wartość 0, co daje dzielenie przez zero. W takim przypadku autor formuł może wiedzieć, że jest to akceptowalne dla tej logiki, pominąć błąd (brak baneru) i zamiast tego zwrócić wartość -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
Tabelę AllErrors można filtrować tak, jak każdą inną tabelę. Używane z funkcją Error można usunąć oczekiwane błędy, a pozostałe błędy zostały zachowane i zgłoszone. Na przykład, gdybyśmy wiedzieli, że dzielenie przez zero nie będzie problemem w określonym kontekście, te błędy można odfiltrować, pozostawiając wszystkie inne błędy nienaruszone za pomocą następującej formuły:
Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )
Krok po kroku
Dodaj kontrolkę Text input i nadaj jej nazwę TextInput1, jeśli nazwa domyślna jest inna.
Dodaj kontrolkę Label i nadaj jej nazwę Label1, jeśli nazwa domyślna jest inna.
Ustaw następującą formułę dla właściwości Text kontrolki Label1:
IfError( Value( TextInput1.Text ), -1 )
W polu TextInput1 wprowadź 1234.
Label1 pokazuje wartość 1234 , ponieważ jest to prawidłowe dane wejściowe funkcji Value.
W polu TextInput1 wprowadź ToInfinity.
Label1 pokazuje wartość-1 , ponieważ nie jest to prawidłowe dane wejściowe funkcji Value. Gdyby funkcja Value nie została umieszczona w funkcji IfError, etykieta nie wyświetlałaby wartości, ponieważ błędna wartość jest traktowana jako wartość pusta.