Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das in diesem Artikel beschriebene Verhalten ist nur verfügbar, wenn das Feature zur Fehlerverwaltung auf Formelebene aktiviert ist.
Power Fx unterstützt die Fehlerbehandlung auf Formelebene. Dieses Feature ist für alle neuen Apps standardmäßig aktiviert. Einige ältere Apps haben es jedoch möglicherweise in den App-Einstellungen deaktiviert. Lassen Sie diese Funktion eingeschaltet.
- Öffnen Sie die Canvas-App im Bearbeitungsmodus.
- Wechseln Sie zur Registerkarte Einstellungen>Updates>Eingestellt.
- Stellen Sie sicher , dass die Verwaltung auf Formelebene deaktiviert ist.
Weitere Informationen finden Sie unter Steuern, welche Features aktiviert sind.
Fehler passieren. Netzwerke fallen aus, Speicher füllt sich, unerwartete Werte treten auf. Es ist wichtig, dass Ihre Logik ordnungsgemäß funktioniert, selbst angesichts potenzieller Probleme.
Standardmäßig fließen Fehler durch die Formeln einer App und werden dem Endbenutzer der App gemeldet. Auf diese Weise weiß der Endbenutzer, dass etwas Unerwartetes passiert ist. Sie können das Problem möglicherweise selbst mit einer anderen Eingabe beheben oder das Problem dem Besitzer der App melden.
Übernehmen Sie als App-Hersteller die Kontrolle über Fehler in Ihrer App:
- Erkennen und Behandeln eines Fehlers. Wenn möglicherweise ein Fehler auftritt, schreiben Sie die Formeln der App, um die Fehlerbedingung zu erkennen und den Vorgang erneut auszuführen. Der Endbenutzer muss sich keine Sorgen machen, dass ein Fehler aufgetreten ist, weil der Ersteller diese Möglichkeit berücksichtigt hat. Erfassen Sie den Fehler mithilfe der Funktionen IfError, IsError und IsErrorOrBlank innerhalb einer Formel.
- Melden Sie einen Fehler. Wenn ein Fehler nicht in der Formel behandelt wird, in der er aufgetreten ist, wird er zum App.OnError-Handler weitergeleitet. Sie können den Fehler nicht ersetzen, da er bereits aufgetreten ist und Teil von Formelberechnungen ist. Aber Sie können App.OnError verwenden, um zu steuern, wie der Fehler an den Endbenutzer gemeldet wird, einschließlich der vollständigen Unterdrückung der Fehlerberichterstattung. App.OnError bietet zudem einen gemeinsamen Engpass für die Fehlerberichterstattung in der gesamten App.
- Erstellen Sie einen Fehler und werfen Sie ihn erneut aus. Schließlich können Sie eine Fehlerbedingung mit Ihrer eigenen Logik erkennen, eine für Ihre App spezifische Bedingung. Verwenden Sie die Error-Funktion zum Erstellen benutzerdefinierter Fehler. Verwenden Sie die Error-Funktion , um einen Fehler erneut zu erfragen, nachdem sie in IfError oder App.OnError abgefragt wurden.
Erste Schritte
Beginnen wir mit einem einfachen Beispiel.
- Erstellen Sie einen neuen Bildschirm in einer Power Apps Canvas-App.
- Fügen Sie ein Text input-Steuerelement ein. Standardmäßig wird der Name "TextInput1" verwendet.
- Fügen Sie ein Label-Steuerelement ein.
- Legen Sie die Text-Eigenschaft des Label-Steuerelements auf die folgende Formel fest:
1/Value( TextInput1.Text )
Es wird ein Fehler angezeigt, da der Standardtext eines TextInput-Steuerelements lautet "Text input", der nicht in eine Zahl konvertiert werden kann. Standardmäßig ist dies eine gute Sache: Der Endbenutzer erhält eine Benachrichtigung, dass etwas nicht wie erwartet in der App funktioniert.
Offensichtlich möchten Sie nicht, dass der Benutzer bei jedem Start dieser App auf einen Fehler stößt. Wahrscheinlich ist "Text input" sowieso nicht der richtige Standardwert für das Texteingabefeld. Um dieses Problem zu beheben, ändern Sie die Standardeigenschaft des TextInput-Steuerelements in:
Blank()
Hmm, jetzt wird ein anderer Fehler angezeigt. Mathematische Vorgänge mit leerem Wert, z. B. Division, wandeln den leeren Wert auf eine Null um. Dieser Wert führt zu einem Fehler durch Division durch Null. Um dieses Problem zu beheben, müssen Sie entscheiden, welches Verhalten für diese Situation in dieser App geeignet ist. Die Antwort wäre es möglicherweise, leer anzuzeigen, wenn die Texteingabe leer ist. Sie können dieses Ziel erreichen, indem Sie Ihre Formel mit der Funktion IfError umschließen:
IfError( 1/Value( TextInput1.Text ), Blank() )
Jetzt wird der Fehler durch einen gültigen Wert ersetzt, und das Fehlerbanner wird entfernt. Möglicherweise haben Sie jedoch das Ziel überschritten. Der IfError, den Sie verwendet haben, deckt alle Fehler ab, einschließlich der Eingabe eines ungültigen Werts, z."hello" B. . Sie können dieses Problem beheben, indem Sie Ihr IfError so optimieren, dass nur die Division durch Null behandelt wird, und alle anderen Fehler erneut auslösen.
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Führen Sie also Ihre App aus, und probieren Sie einige andere Werte aus.
Wenn kein Wert eingegeben ist, wie z. B. beim Start der App, wird keine Antwort angezeigt, da der Standardwert leer ist – aber es wird auch kein Fehler angezeigt, da IfError den Division-durch-Null-Fehler ersetzt.
Wenn Sie eine 4 eingeben, erhalten Sie das erwartete Ergebnis von 0,25:
Und wenn Sie etwas unzulässiges eingeben, wie helloetwa, erhalten Sie ein Fehlerbanner:
Dies ist ein einfaches Beispiel zur Einführung. Je nach den Anforderungen der App können Sie Fehler auf viele verschiedene Arten behandeln:
- Anstelle eines Fehlerbanners könnten Sie im Bezeichnungssteuerelement die Formel "#Error" anzeigen. Damit die Typen der Ersetzungen mit dem ersten Argument in IfError kompatibel sind, müssen Sie das numerische Ergebnis mithilfe der Textfunktion explizit in eine Textzeichenfolge konvertieren.
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- Anstatt diese bestimmte Instanz mit IfError umschließen, könnten Sie einen zentralisierten App.OnError-Handler schreiben. Sie können die Zeichenfolge nicht durch "#Error" ersetzen, da der Fehler bereits aufgetreten ist und "App.OnError " nur zur Steuerung der Berichterstellung bereitgestellt wird.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Fehlerweitergabe
Ähnlich wie in Excel fließen Fehler durch Formeln. Wenn z. B. in Excel die Zelle A1 die Formel =1/0enthält, zeigt A1 den Fehlerwert #DIV0!an:
Wenn sich die Zelle A2 mit einer Formel wie A1 etwa auf =A1*2 bezieht, wird der Fehler auch durch diese Formel übertragen.
Der Fehler ersetzt den Wert, den die Formel andernfalls berechnen würde. Es gibt kein Ergebnis für die Multiplikation in Zelle A2, sondern nur der Fehler der Division in A1 ist vorhanden.
Power Fx funktioniert auf dieselbe Weise. Wenn Sie in der Regel einen Fehler als Argument für eine Funktion oder einen Operator angeben, wird der Vorgang nicht ausgeführt. Der Eingabefehler fließt als Ergebnis des Vorgangs durch. Gibt z. B Mid( Text( 1/0 ), 1, 1 ) . einen Division by Zero-Fehler zurück, da der innerste Fehler die Textfunktion und die Mid-Funktion durchläuft:
Im Allgemeinen fließen Fehler nicht durch Power Apps Steuerelementeigenschaften. Lassen Sie uns das vorherige Beispiel um ein weiteres Steuerelement erweitern, das anzeigt, ob die Eigenschaft des ersten Labels ein Fehlerzustand ist.
Es ist in Ordnung, dass Fehler nicht über ein Steuerelement weitergegeben werden, da das System Fehler bei der Eingabe für alle Steuerelementeigenschaften beobachtet. Der Fehler geht nicht verloren.
Die meisten Funktionen und Operatoren folgen der Regel „Fehler rein, Fehler raus“, aber es gibt einige Ausnahmen. Die Funktionen IsError, IsErrorOrBlank und IfError sind für das Arbeiten mit Fehlern konzipiert, sodass sie möglicherweise keinen Fehler zurückgeben, auch wenn eine an sie übergeben wird.
Fehler beobachten
Power Fx beobachtet keine Fehler, bis die Formel den Fehlerwert verwendet.
Daher gibt die Funktion "Wenn " und " Auswählen " möglicherweise keinen Fehler zurück, wenn eine übergeben wird. Betrachten Sie die Formel If( false, 1/0, 3 ). In dieser Formel gibt es eine Division durch Null, aber da die Funktion If diesen Zweig aufgrund der Bedingung false nicht nimmt, melden Power Fx und Power Apps keinen Fehler.
Wenn Sie die Set-Funktion mit einem Fehler verwenden, wird an dem Punkt, an dem der Fehler in die Variable eingefügt wird, kein Fehler gemeldet. In Power Apps gibt es zum Beispiel eine Formel im App.OnStart, die einen Division-durch-Null-Fehler in die Variable x setzt:
Es wird kein Fehler gemeldet, da x nicht referenziert wird. Wenn Sie jedoch ein Bezeichnungssteuerelement hinzufügen und dessen Texteigenschaft auf x festlegen, wird der Fehler angezeigt.
Sie können Fehler in einer Formel mithilfe der Funktionen IfError, IsError und IsErrorOrBlank beobachten. Mithilfe dieser Funktionen können Sie einen alternativen Wert zurückgeben, alternative Aktionen ausführen oder den Fehler ändern, bevor er beobachtet und gemeldet wird.
Fehler berichten
Nachdem Power Fx einen Fehler beobachtet hat, besteht der nächste Schritt darin, den Fehler an den Endbenutzer zu melden.
Im Gegensatz zu Excel gibt es nicht immer einen praktischen Ort, um ein Fehlerergebnis anzuzeigen, da das Ergebnis einer Formel möglicherweise eine Eigenschaft wie X- und Y-Koordinaten eines Steuerelements steuert, für das kein praktischer Ort zum Anzeigen von Text vorhanden ist. Jeder Power Fx-Host steuert, wie Fehler dem Endbenutzer letztendlich angezeigt werden und wie viel Kontrolle der Ersteller über diesen Prozess hat. In Power Apps wird ein Fehlerbanner angezeigt und App.OnError verwendet, um zu steuern, wie der Fehler gemeldet wird.
Beachten Sie, dass App.OnError den Fehler nicht auf dieselbe Weise wie IfError ersetzen kann. An dem Punkt, an dem App.OnError ausgeführt wird, ist der Fehler bereits aufgetreten, und das Ergebnis wird durch andere Formeln weitergegeben. App.OnError steuert nur, wie der Fehler dem Endbenutzer gemeldet wird, und bietet dem Ersteller einen Hook, um den Fehler bei Bedarf zu protokollieren.
Die Bereichsvariablen FirstError und AllErrors liefern Kontextinformationen zu etwaigen Fehlern. Dieser Kontext enthält Informationen zur Art des Fehlers, wo der Fehler aufgetreten ist und wo er beobachtet wurde.
Nach einem Fehler beenden
Verhaltensformeln unterstützen das Ergreifen von Maßnahmen, Ändern von Datenbanken und Ändern des Status. Mit diesen Formeln können mehrere Aktionen in einer Sequenz mithilfe des ; Verkettungsoperators (oder ;; abhängig vom Gebietsschema) ausgeführt werden.
In diesem Fall zeigt das Rastersteuerelement beispielsweise an, was sich in der T Tabelle befindet. Jede Schaltflächenauswahl ändert den Status in dieser Tabelle mit zwei Patch-Aufrufen:
In einer verketteten Verhaltensformel werden Aktionen nicht nach dem ersten Fehler beendet. Nun ändern wir unser Beispiel so, dass im ersten Patch-Aufruf eine ungültige Indexnummer übergeben wird. Der zweite Patch läuft trotz dieses früheren Fehlers weiter. Der erste Fehler wird dem Endbenutzer gemeldet und als Fehler in Studio auf dem Steuerelement angezeigt:
Verwenden Sie IfError , um die Ausführung nach einem Fehler zu beenden. Ähnlich wie bei der If-Funktion bietet das dritte Argument dieser Funktion einen Platz für Aktionen, die nur ausgeführt werden sollen, wenn kein Fehler vorliegt:
Wenn während einer der Iterationen von ForAll ein Fehler auftritt, werden die restlichen Iterationen nicht beendet. ForAll ist so konzipiert, dass jede Iteration unabhängig ausgeführt wird, was eine parallele Ausführung ermöglicht. Wenn das ForAll-Objekt abgeschlossen ist, wird ein Fehler zurückgegeben, der alle aufgetretenen Fehler enthält (durch Untersuchen von AllErrors in IfError oder App.OnError).
Die folgende Formel führt z. B. dazu, dass ForAll zwei Fehler zurückgibt (jeweils für die Division durch Null mit Value, die zweimal auftritt) und Collection drei Datensätze enthält (für den Fall, dass Value nicht 0 ist): [1, 2, 3].
Clear( Collection );
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );
Mit mehreren Fehlern arbeiten
Da eine Verhaltensformel mehr als eine Aktion ausführen kann, kann es dabei auch zu mehr als einem Fehler kommen.
Standardmäßig meldet die App den ersten Fehler an den Endbenutzer. In diesem Beispiel schlagen beide Patchaufrufe fehl, aber der zweite Aufruf schlägt mit einem Fehler bei der Division durch Null fehl. Der Benutzer sieht nur den ersten Fehler im Index:
Die IfError-Funktion und App.OnError können auf alle Fehler zugreifen, die mit der Bereichsvariable AllErrors auftreten. In diesem Fall können Sie diese Variable auf eine globale Variable festlegen und beide aufgetretenen Fehler untersuchen. Sie erscheinen in derselben Reihenfolge in der Tabelle, in der sie auch aufgetreten sind:
Nicht-Verhaltensformeln können auch mehrere Fehler ausgeben. Die Verwendung der Patch-Funktion kann beispielsweise mehrere Fehler zurückgeben, wenn ein Stapel von Datensätzen aktualisiert werden soll – ein Fehler für jeden fehlgeschlagenen Datensatz.
Fehler in Tabellen
Wie Sie bereits gesehen haben, können Sie Fehler in Variablen speichern. Sie können auch Fehler in Datenstrukturen, z. B. Tabellen, einschließen. Dieser Ansatz ist wichtig, da dadurch sichergestellt wird, dass ein Fehler für einen Datensatz die gesamte Tabelle nicht ungültig machen kann.
Betrachten Sie beispielsweise dieses Datentabellensteuerelement in Power Apps:
Bei der Berechnung in AddColumns wurde für einen der Werte ein Division-durch-Null-Fehler aufgetreten. Für diesen einen Datensatz hat die Spalte Reciprocal einen Fehlerwert (Division durch Null), die anderen Datensätze jedoch nicht – sie sind fehlerfrei.
IsError( Index( output, 2 ) ) gibt „false“ zurück, und IsError( Index( output, 2 ).Value ) gibt „true“ zurück.
Wenn beim Filtern einer Tabelle ein Fehler auftritt, ist der gesamte Datensatz ein Fehler. Der Vorgang gibt weiterhin den Datensatz im Ergebnis zurück, sodass der Endbenutzer weiß, dass etwas vorhanden war und ein Problem vorliegt.
Sehen wir uns dieses Beispiel an. Hier weist die ursprüngliche Tabelle keine Fehler auf, aber beim Filtern entsteht ein Fehler, wann immer Wert gleich 0 ist:
Die Werte -5 und -3 werden korrekt gefiltert. Die Werte 0 führen zu einem Fehler bei der Filterverarbeitung, sodass unklar ist, ob der Datensatz im Ergebnis aufgenommen werden soll oder nicht. Um die Transparenz für Endbenutzer zu maximieren und die Debug-Entscheidungsträger zu unterstützen, enthält der Vorgang anstelle des Originals einen Fehlerdatensatz. In diesem Fall gibt IsError( Index( output, 2 ) ) „true“ zurück.
Fehler in der Datenquelle
Die Funktionen, die Daten in Datenquellen ändern, wie Patch, Collect, Remove, RemoveIf, Update, UpdateIf und SubmitForm, melden Fehler auf zwei Arten:
- Jede dieser Funktionen gibt einen Fehlerwert als Ergebnis des Vorgangs zurück. Sie können Fehler mithilfe von IsError erkennen und Fehler mithilfe von IfError und App.OnError wie gewohnt ersetzen oder unterdrücken.
- Nach dem Vorgang gibt die Fehlerfunktion auch die Fehler für vorherige Vorgänge zurück. Dieses Verhalten kann nützlich sein, um die Fehlermeldung auf einem Formularbildschirm anzuzeigen, ohne den Fehler in einer Zustandsvariable erfassen zu müssen.
Diese Formel sucht z. B. nach einem Fehler aus "Sammeln " und zeigt eine benutzerdefinierte Fehlermeldung an:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
Die Errors-Funktion gibt auch Informationen zu vergangenen Fehlern während Laufzeitvorgängen zurück. Dies kann nützlich sein, um einen Fehler auf einem Formularbildschirm anzuzeigen, ohne ihn in einer Zustandsvariablen erfassen zu müssen.
Fehler erneut auslösen
Manchmal erwarten Sie potenzielle Fehler und können sie sicher ignorieren. Wenn innerhalb von IfError und App.OnError ein Fehler erkannt wird, der an den nächsten höheren Handler übergeben werden soll, lösen Sie ihn mithilfe von Error( AllErrors ) erneut aus.
Eigene Fehler erzeugen
Sie können auch eigene Fehler erstellen, indem Sie die Fehlerfunktion verwenden.
Wenn Sie eigene Fehler erstellen, verwenden Sie Werte, die größer als 1.000 sind, um potenzielle Konflikte mit zukünftigen Systemfehlerwerten zu vermeiden.
ErrorKind-Enum-Werte
| ErrorKind-Enumeration | Wert | Beschreibung |
|---|---|---|
| Analysefehler | 18 | Systemfehler. Es gibt ein Problem mit der Compileranalyse. |
| UngültigerSprachcode | 14 | Ein ungültiger oder nicht erkannter Sprachcode wurde verwendet. |
| BadRegex | 15 | Ungültiger regulärer Ausdruck. Überprüfen Sie die Syntax, die mit den Funktionen IsMatch, Match oder MatchAll verwendet wird. |
| Konflikt | 6 | Der Datensatz, den Sie gerade aktualisieren, wurde bereits an der Quelle geändert, und Sie müssen den Konflikt lösen. Eine gängige Lösung besteht darin, alle lokalen Änderungen zu speichern, den Datensatz zu aktualisieren und die Änderungen erneut anzuwenden. |
| Einschränkungsverletzt | 8 | Der Datensatz hat eine Einschränkungsprüfung auf dem Server nicht durchlaufen. |
| ErstelleBerechtigung | 3 | Sie sind nicht berechtigt, einen Datensatz für die Datenquelle zu erstellen. Dies passiert beispielsweise, wenn die Collect-Funktion aufgerufen wurde. |
| Löschberechtigungen | 5 | Sie sind nicht berechtigt, einen Datensatz für die Datenquelle zu löschen. Dies passiert beispielsweise, wenn die Remove-Funktion aufgerufen wurde. |
| Div0 | 13 | Division durch Null. |
| Berechtigungen bearbeiten | 4 | Sie sind nicht berechtigt, einen Datensatz für die Datenquelle zu erstellen. Dies passiert beispielsweise, wenn die Patch-Funktion aufgerufen wurde. |
| GeneratedValue | 9 | Für ein Feld, das vom Server automatisch berechnet wird, wurde ein Wert fälschlicherweise an den Server übergeben. |
| UngültigeFunktionsverwendung | 16 | Ungültige Verwendung einer Funktion. Oft ist mindestens ein Argument der Funktion fehlerhaft oder wird auf ungültige Weise verwendet. |
| DateiNichtGefunden | 17 | Der SaveData-Speicher wurde nicht gefunden. |
| UnzureichenderSpeicher | 21 | Für den Vorgang ist nicht genügend Arbeitsspeicher oder Speicherplatz auf dem Gerät vorhanden. |
| InvalidArgument | 25 | Ein ungültiges Argument wurde an eine Funktion übergeben. |
| Internal | 26 | Systemfehler. Es gibt ein internes Problem mit einer der Funktionen. |
| FehlendesErforderlich | 2 | Ein erforderliches Feld eines Datensatzes fehlt. |
| Netzwerk | 23 | Es gibt ein Problem mit der Netzwerkkommunikation. |
| None | 0 | Systemfehler. Es liegt kein Fehler vor. |
| Nicht anwendbar | 27 | Es ist kein Wert verfügbar. Dieser Fehler ist nützlich, um einen leeren Wert zu unterscheiden, der in numerischen Berechnungen als Null behandelt werden kann, von leeren Werten, die bei Verwendung des Werts als potenzielles Problem gekennzeichnet werden sollten. |
| Nicht gefunden | 7 | Datensatz konnte nicht gefunden werden. Dies kann sich beispielsweise auf den Datensatz beziehen, der in der Patch-Funktion geändert werden soll. |
| Nicht unterstützt | 20 | Der Vorgang wird von diesem Spieler oder Gerät nicht unterstützt. |
| Numerisch | 24 | Eine numerische Funktion wurde nicht ordnungsgemäß verwendet. Beispiel: Sqrt mit -1. |
| Angebotsüberschreitung | 22 | Speicherplatz wurde überschritten. |
| ReadOnlyValue | 10 | Die Spalte ist schreibgeschützt und kann nicht geändert werden. |
| Leseberechtigung | 19 | Ihnen fehlt die Berechtigung, Datenbankeinträge der Datenquelle zu lesen. |
| Synchronisierung | 1 | Die Datenquelle hat einen Fehler gemeldet. Überprüfen Sie die Meldungsspalte auf weitere Informationen. |
| Unbekannt | 12 | Es ist ein unbekannter Fehler aufgetreten. |
| Validierung | 11 | Der Datensatz hat eine Validierungsprüfung nicht bestanden. |