Fehler beheben

Erfahren Sie, wie Sie Fehler und Ausnahmen behandeln.

Bei Java-Fehlern werden beim Erstellen oder Ausführen Ihrer Anwendung Ausnahmen ausgelöst. Die meisten vom Treiber ausgegebenen Ausnahmen sind die Basis der Klasse NoSQLException. Für einige Klassen löst der Treiber Ausnahmen jedoch direkt aus, wie z.B. für IllegalArgumentException und NullPointerException.

NoSQL-Ausnahmeinstanzen werden in der Regel in zwei allgemeine Kategorien unterteilt:

  • Ausnahmen, bei denen eine Wiederholung möglich ist (mit der Erwartung, dass die Ausführung bei der Wiederholung erfolgreich ist).

    Diese Ausnahmen sind Instanzen der Klasse RetryableException. Derartige Ausnahmen weisen im Allgemeinen auf Verstöße gegen die Ressourcennutzung hin, wie z.B. ThrottlingException.

  • Ausnahmen, bei denen die Ausführung auch bei einer Wiederholung nicht erfolgreich ist.

    Beispiele für Ausnahmen, bei denen sich keine Wiederholung empfiehlt, sind IllegalArgumentException, TableNotFoundException sowie alle sonstigen Ausnahmen, die auf einen syntaktischen oder semantischen Fehler hinweisen.

Weitere Informationen zu diesen Ausnahmen und ihrer Behandlung finden Sie in der Java-API-Referenzdokumentation.

Python-Fehler werden als Ausnahmen ausgelöst, die als Teil der API definiert sind. Sie sind alle Instanzen von Python RuntimeError. Die meisten Ausnahmen sind Instanzen von borneo.NoSQLException, eine Basisklasse für Ausnahmen, die vom Python-Treiber ausgelöst werden.

Ausnahmen sind in 2 allgemeine Kategorien unterteilt: Ausnahmen, die mit der Erwartung wiederholt werden können, dass sie bei der Wiederholung erfolgreich sind. Dies sind alle Instanzen von borneo.RetryableException. Beispiele hierfür sind die Instanzen von borneo.ThrottlingException, die ausgelöst werden, wenn die Ressourcenverbrauchslimits überschritten werden. Ausnahmen, die nicht wiederholt werden sollten, da sie erneut fehlschlagen. Beispiele hierfür sind borneo.IllegalArgumentException, borneo.TableNotFoundException usw.

borneo.ThrottlingException-Instanzen werden in einer On-Premise-Konfiguration nie ausgelöst, da keine relevanten Limits vorhanden sind.

Go-SDK-Fehler werden als nosqlerr.Error-Werte gemeldet, die als Teil der API definiert sind. Fehler werden in 2 allgemeine Kategorien unterteilt:
  • Fehler, die möglicherweise mit der Erwartung wiederholt werden, dass sie bei der Wiederholung erfolgreich sind. Dies sind wiederholbare Fehler, bei denen der Error.Retryable()-Methodenaufruf true zurückgibt. Beispiele hierfür sind nosqlerr.OperationLimitExceeded, nosqlerr.ReadLimitExceeded, nosqlerr.WriteLimitExceeded, die bei Überschreitung von Ressourcenverbrauchslimits ausgelöst werden.
  • Fehler, die nicht wiederholt werden sollten, da sie erneut fehlschlagen. Beispiele hierfür sind nosqlerr.IllegalArgumentError, nosqlerr.TableNotFoundError usw.

Asynchrone Methoden von NoSQLClient geben die Zusage als Ergebnis zurück. Wenn ein Fehler auftritt, wird die Zusage mit diesem Fehler abgelehnt. Für synchrone Methoden wie NoSQLClient-Konstruktorfehler werden als Ausnahmen ausgelöst. Alle vom SDK verwendeten Fehler sind Instanzen von NoSQLError oder eine seiner Unterklassen. Neben der Fehlermeldung ist für jeden Fehler die Eigenschaft errorCode auf einen der Standardfehlercodes gesetzt, die von der Enumeration ErrorCode definiert werden. errorCode kann nützlich sein, um bedingte Logik abhängig von der Art des Fehlers auszuführen.

Bei einigen Fehlercodes sind bestimmte Unterklassen von NoSQLError definiert, wie NoSQLArgumentError, NoSQLProtocolError, NoSQLTimeoutError usw. NoSQLAuthorizationError kann je nach Ursache des Autorisierungsfehlers einen von mehreren Fehlercodes aufweisen. Darüber hinaus kann die Eigenschaft cause für Fehler auf den zugrunde liegenden Fehler gesetzt sein, der den aktuellen Fehler verursacht hat. Beachten Sie, dass die Ursache optional ist und eine Instanz eines Fehlers sein kann, der nicht zum SDK gehört.

Außerdem werden Fehlercodes in 2 allgemeine Kategorien unterteilt:
  • Fehler, die möglicherweise mit der Erwartung wiederholt werden, dass der Vorgang bei der Wiederholung erfolgreich ist. Beispiele hierfür sind ErrorCode.READ_LIMIT_EXCEEDED und ErrorCode.WRITE_LIMIT_EXCEEDED, bei denen es sich um Throttling-Fehler (für die Cloud-Umgebung relevant) handelt, sowie ErrorCode.NETWORK_ERROR, da die meisten Netzwerkbedingungen temporär sind.
  • Fehler, die nicht wiederholt werden sollten, da der Vorgang höchstwahrscheinlich erneut fehlschlägt. Beispiele hierfür sind ErrorCode.ILLEGAL_ARGUMENT (repräsentiert durch NoSQLArgumentError), ErrorCode.TABLE_NOT_FOUND usw.
Sie können bestimmen, ob NoSQLError wiederholt werden kann, indem Sie die Eigenschaft retryable prüfen. Der Wert ist für wiederholbare Fehler auf "true" gesetzt und für nicht wiederholbare Fehler falsch oder nicht definiert.

Handler wiederholen

Der Treiber wiederholt die Vorgänge bei einem wiederholbaren Fehler automatisch. Wiederholungs-Handler bestimmt:
  • Gibt an, ob und wie oft der Vorgang wiederholt wird.
  • Wartezeit vor jeder Wiederholung.
RetryHandler ist eine Schnittstelle mit 2 Eigenschaften:
  • RetryHandler#doRetry, die bestimmt, ob der Vorgang basierend auf dem Vorgang wiederholt werden soll, die Anzahl der bisherigen Wiederholungen und der Fehler. Diese Eigenschaft ist in der Regel eine Funktion, kann jedoch auch auf "Boolescher Wert" gesetzt werden, um automatische Wiederholungen zu deaktivieren.
  • RetryHandler#delay, die bestimmt, wie lange vor jeder nachfolgenden Wiederholung gewartet werden soll, basierend auf denselben Informationen wie für RetryHandler#doRetry. Diese Eigenschaft ist in der Regel eine Funktion, kann jedoch auch auf die Anzahl der Millisekunden für eine konstante Verzögerung festgelegt werden.
NoSQLException dient als Basisklasse für viele vom Treiber ausgelöste Ausnahmen. In bestimmten Fällen verwendet der Treiber jedoch Standardausnahmetypen wie:
  • ArgumentException und die zugehörigen Unterklassen, wie ArgumentNullException. Sie werden ausgelöst, wenn ein ungültiges Argument an eine Methode übergeben wird oder wenn eine ungültige Konfiguration (in Code oder in JSON) an die NoSQLClient-Instanz übergeben wird.
  • TimeoutException wird ausgelöst, wenn ein von NoSQLClient ausgegebener Vorgang wegen Timeout abgebrochen wurde. Wenn Sie viele Timeoutausnahmen erhalten, können Sie versuchen, die Timeoutwerte in NoSQLConfig oder im Optionsargument zu erhöhen, das an die Methode NoSQLClient übergeben wird.
  • InvalidOperationException wird ausgelöst, wenn der Service einen ungültigen Status zur Ausführung eines Vorgangs aufweist. Es kann auch ausgelöst werden, wenn die Abfrage nicht erfolgreich war, weil die Verarbeitung das in QueryOptions.MaxMemoryMB oder NoSQLConfig.MaxMemoryMB angegebene Speicherlimit überschritten hat. In diesem Fall können Sie den entsprechenden Speichergrenzwert erhöhen. Andernfalls können Sie den Vorgang wiederholen.
  • InvalidCastException und OverflowException können auftreten, wenn Sie mit Untergruppen von FieldValue arbeiten und versuchen, einen Wert in einen Typ umzuwandeln, der nicht unterstützt wird, oder einen numerischen Wert in einen kleineren Typ umwandeln, der zu arithmetischem Überlauf führt.
  • OperationCanceledException und TaskCanceledException, wenn Sie eine Stornierung des Vorgangs ausgegeben haben, der von einer Methode von NoSQLClient mit dem angegebenen CancellationToken gestartet wurde.
Außerdem können Ausnahmen in zwei große Kategorien unterteilt werden:
  • Ausnahmen, bei denen der Vorgang bei der Wiederholung möglicherweise erfolgreich war. Im Allgemeinen handelt es sich dabei um Unterklassen von RetryableException. Dazu gehören Throttling-Ausnahmen sowie andere Ausnahmen, bei denen eine Ressource vorübergehend nicht verfügbar ist. Einige andere Unterklassen von NoSQLException können auch wiederholt werden, je nachdem, unter welchen Bedingungen die Ausnahme aufgetreten ist. Darüber hinaus können netzwerkbezogene Fehler wiederholt werden, da die meisten Netzwerkbedingungen vorübergehend sind.
  • Ausnahmen, die nicht wiederholt werden sollten, da sie nach der Wiederholung immer noch nicht erfolgreich sind. Sie umfassen Ausnahmen wie TableNotFoundException, TableExistsException und andere sowie Standardausnahmen wie ArgumentException.
Sie können bestimmen, ob eine Instanz von NoSQLException wiederholt werden kann, indem Sie die Eigenschaft IsRetryable prüfen.

Handler wiederholen

Standardmäßig wiederholt der Treiber automatisch Vorgänge, die eine wiederholbare Ausnahme ausgelöst haben (siehe oben). Der Treiber verwendet den Wiederholungs-Handler zur Steuerung von Vorgangswiederholungen. Der Wiederholungs-Handler bestimmt Folgendes:
  • Gibt an, ob und wie oft der Vorgang wiederholt wird.
  • Wartezeit vor jeder Wiederholung.
Alle Wiederholungs-Handler implementieren die Schnittstelle IRetryHandler. Diese Schnittstelle bietet zwei Methoden: eine Methode, um zu bestimmen, ob der Vorgang im aktuellen Status wiederholt werden soll, und eine andere Methode, um eine Wiederholungsverzögerung vor der nächsten Wiederholung zu bestimmen. Sie können den Standardwiederholungs-Handler verwenden oder Ihren eigenen Wiederholungs-Handler beim Erstellen der NoSQLClient-Instanz als RetryHandler-Eigenschaft NoSQLConfig festlegen.
Hinweis

Wiederholungen werden nur innerhalb des dem Vorgang zugewiesenen Timeoutzeitraums ausgeführt und als eine der Timeouteigenschaften in NoSQLConfig oder in Optionen konfiguriert, die an die Methode NoSQLClient übergeben werden. Wenn der Vorgang oder seine Wiederholungen nicht erfolgreich waren, bevor der Timeout erreicht wurde, wird TimeoutException ausgelöst.
Standardmäßig verwendet der Treiber die Klasse NoSQLRetryHandler, die Ausgänge basierend auf Vorgangstyp, Ausnahmetyp steuert und ob die Anzahl der ausgeführten Wiederholungen einen vorkonfigurierten Höchstwert erreicht hat. Außerdem wird die exponentielle Backoff-Verzögerung verwendet, um zwischen Wiederholungen zu warten, die mit einer vorkonfigurierten Basisverzögerung beginnen. Sie können die Eigenschaften wie die maximale Anzahl an Wiederholungen, Basisverzögerungen und andere anpassen, indem Sie Ihre eigene Instanz von NoSQLRetryHandler erstellen und sie als RetryHandler-Eigenschaft in NoSQLConfig festlegen. Beispiel:
var client = new NoSQLClient(
    new NoSQLConfig
    {
        Region = .....,
        ...............
        RetryHandler = new NoSQLRetryHandler
        {
            MaxRetryAttempts = 20,
            BaseDelay = TimeSpan.FromSeconds(2)
        }
    });
Wenn Sie den Wiederholungs-Handler nicht angeben, verwendet der Treiber eine Instanz von NoSQLRetryHandler mit Standardwerten für alle Parameter. Alternativ können Sie eine eigene Wiederholungs-Handler-Klasse erstellen, indem Sie die IRetryHandler -Schnittstelle implementieren. Die letzte Option besteht darin, Wiederholungen gemeinsam zu deaktivieren. Dies ist möglich, wenn Sie stattdessen die Vorgänge in Ihrer Anwendung wiederholen möchten. Um Wiederholungen zu deaktivieren, setzen Sie die Eigenschaft RetryHandler von NoSQLConfig auf NoRetries:
var client = new NoSQLClient(
    new NoSQLConfig
    {
        Region = .....,
        ...............
        RetryHandler = NoSQLConfig.NoRetries
    });

Ressourcengrenzwerte verarbeiten: Das Programmieren in einer ressourcenbegrenzten Umgebung kann eine Herausforderung darstellen. Tabellen haben benutzerdefinierte Durchsatzlimits. Wenn eine Anwendung diese Limits überschreitet, kann sie gedrosselt werden. Das bedeutet, dass ein Vorgang mit einer der Throttling-Ausnahmen wie ReadThrottlingException oder WriteThrottlingException nicht erfolgreich verläuft. Dies kommt am häufigsten vor, wenn Abfragen verwendet werden, die viele Daten lesen können, wobei die Kapazität sehr schnell genutzt wird. Er kann auch für get- und put-Vorgänge eingesetzt werden, die in einer engen Schleife ausgeführt werden.

Auch wenn Throttling-Fehler wiederholt werden und benutzerdefiniertes RetryHandler möglicherweise eine direktere Kontrolle über Wiederholungen ermöglicht, sollte eine Anwendung sich nicht auf Wiederholungen verlassen, um Throttling zu verarbeiten, da dies zu einer schlechten Performance und zu einer unzulänglichen Verwendung des gesamten verfügbaren Durchsatzes für die Tabelle führen kann. Der bessere Ansatz wäre die Vermeidung von Throttling durch eine Ratenbegrenzung Ihrer Anwendung. Die Ratenbegrenzung bedeutet in diesem Zusammenhang, dass die Betriebsraten unter den Tabellengrenzen gehalten werden.