Funkcje Error, IfError, IsError, IsBlankOrError

Dotyczy: Aplikacje oparte na kanwie Kolumny frmuł Dataverse Przepływy pulpitu Aplikacje oparte na modelach Power Platform CLI

Wykrywa błędy i podaje wartość alternatywną lub wykonuje działanie. Utwórz błąd niestandardowy lub pomiń błąd.

Uwaga

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 zwraca 0 jeśli wartość x wynosi zero, gdyż 1/x będzie skutkowało błędem. 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

IfError zwróci wartość jednego z argumentów. Typy wszystkich wartości, które mogą zostać zwrócone przez składnik IfError muszą być zgodne.

W ostatnim przykładzie Patch zwróci rekord, który nie jest zgodny z wartościami logicznymi używanymi w formułach Zastępczych 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 by nie było, drugi argument zostałby przekształcony w taki sposób, aby był zgodny z typem pierwszego argumentu.

Excel wyświetli #DIV/0!, gdy nastąpi 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 tekstowy "#DIV/0!" zostanie przekształcony na typ pierwszego argumentu IfError, czyli na liczbę. Wynik IfError będzie jeszcze inny, gdyż błąd nie może zostać przekształcony w łańcuchu tekstowym. 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, gdzie FirstError jest skrótem do pierwszego rekordu w tej tabeli. FirstError zawsze zwróci tę samą wartość co First( AllErrors ).

Rekordy błędów obejmują:

Pole Typ Opis
Rodzaj Wyliczenie ErrorKind (liczba) Kategoria błędu.
Wiadomość Ciąg tekstowy Komunikat o błędzie, który jest odpowiedni do wyświetlenia użytkownikowi końcowemu.
Lokalizacja źródłowa Ciąg tekstowy Lokalizacja, w której pochodzi błąd, używana na przykład do raportowania. Na przykład formuła powiązana z właściwością kontrolki będzie miała postać ControlName.PropertyName.
Obserwacja Ciąg tekstowy Lokalizacja, w której błąd został ujawniony użytkownikowi, używana do raportowania. Na przykład formuła powiązana z właściwością kontrolki będzie miała postać ControlName.PropertyName.
Szczegóły Nagraj Szczegóły błędu. Obecnie są podane szczegółowe informacje dotyczące tylko 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:

Aktywowana kontrolka typu Button, pokazująca powiadomienie z funkcji Notify.

Zazwyczaj występuje tylko jeden błąd, z którym FirstError może wystarczająco działać. 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 spowoduje uniemożliwienie dalszego przetwarzania 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 była używana pusta wartość reprezentująca 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żliwi 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

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord – wymagane. Rekord informacji o błędzie, w tym Rodzaj, Wiadomość i inne pola. Rodzaj jest wymagany. FirstError można przekazać bezpośrednio.
  • ErrorTable - wymagane. Tabela rekordów informacji o błędach. AllErrors można przekazać bezpośrednio.

IfError( Wartość1, Zamiennik1 [, Wartość2, Zamiennik2,... [, DefaultResult ] ] )

  • Wartości – wymagane. Co najmniej jedna formuła do testowania pod kątem wartości błędu.
  • Zamiennik – 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 – wartość opcjonalna. Formuły, które mają zostać oszacowane, jeśli w formule nie zostaną znalezione żadne błędy.

IsError( Wartość )
IsBlankOrError( Value )

  • 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, Notify( "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łsz
IsError( Blank() ) Argument jest pusty, ale nie jest to błąd. fałsz
IsError( 1/0 ) Pierwszy argument jest błędem. prawda
If( IsError( 1/0 ), Notify( "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). prawda

Proste IsBlankOrError

Formuła Opis Wynik
IsBlankOrError( 1 ) Argument nie jest błędem ani pusty. fałsz
IsBlankOrError( Blank() ) Argument jest pusty. prawda
IsBlankOrError( 1/0 ) Pierwszy argument jest błędem. prawda

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 będzie w stanie błędu, ponieważ funkcja Wartość ma nieprawidłowy argument. Ponieważ jest to niewyświetlone przez twórcę formuły, jest ono przekazywane przez użytkownika, który go widzi. W drugim przypadku, dla tego samego formuły, b będzie zawierał wartość 0, co spowoduje podział na 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 by odfiltrować, pozostawiając wszystkie inne błędy bez zmian za pomocą następującego wzoru:

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

Krok po kroku

  1. Dodaj kontrolkę Text input i nadaj jej nazwę TextInput1, jeśli nazwa domyślna jest inna.

  2. Dodaj kontrolkę Label i nadaj jej nazwę Label1, jeśli nazwa domyślna jest inna.

  3. Ustaw następującą formułę dla właściwości Text kontrolki Label1:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. W polu TextInput1 wprowadź 1234.

    Kontrolka Label1 będzie wyświetlać wartość 1234, ponieważ jest to prawidłowa wartość wejściowa dla funkcji Value.

  5. W polu TextInput1 wprowadź ToInfinity.

    Kontrolka Label1 będzie wyświetlać wartość -1, ponieważ nie jest to prawidłowa wartość wejściowa dla 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.

Zobacz także

Informacje dotyczące formuł Power Apps