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.
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()
-Methodenaufruftrue
zurückgibt. Beispiele hierfür sindnosqlerr.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.
- 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
undErrorCode.WRITE_LIMIT_EXCEEDED
, bei denen es sich um Throttling-Fehler (für die Cloud-Umgebung relevant) handelt, sowieErrorCode.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 durchNoSQLArgumentError
),ErrorCode.TABLE_NOT_FOUND
usw.
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
- Gibt an, ob und wie oft der Vorgang wiederholt wird.
- Wartezeit vor jeder Wiederholung.
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ürRetryHandler#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.
ArgumentException
und die zugehörigen Unterklassen, wieArgumentNullException
. 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 vonNoSQLClient
ausgegebener Vorgang wegen Timeout abgebrochen wurde. Wenn Sie viele Timeoutausnahmen erhalten, können Sie versuchen, die Timeoutwerte inNoSQLConfig
oder im Optionsargument zu erhöhen, das an die MethodeNoSQLClient
ü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 inQueryOptions.MaxMemoryMB
oderNoSQLConfig.MaxMemoryMB
angegebene Speicherlimit überschritten hat. In diesem Fall können Sie den entsprechenden Speichergrenzwert erhöhen. Andernfalls können Sie den Vorgang wiederholen.InvalidCastException
undOverflowException
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
undTaskCanceledException
, wenn Sie eine Stornierung des Vorgangs ausgegeben haben, der von einer Methode vonNoSQLClient
mit dem angegebenen CancellationToken gestartet wurde.
- 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 vonNoSQLException
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 wieArgumentException
.
NoSQLException
wiederholt werden kann, indem Sie die Eigenschaft IsRetryable
prüfen.
Handler wiederholen
- Gibt an, ob und wie oft der Vorgang wiederholt wird.
- Wartezeit vor jeder Wiederholung.
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.
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.
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.