Optimistische Kollisionsausnahme

Sie können eine Ausnahme des Typs "OptimisticCollisionException" direkt oder über eine Ausnahme des Typs "ObjectGridException" empfangen.

Der folgende Code ist ein Beispiel für das Abfangen der Ausnahme und die anschließende Anzeige der entsprechenden Nachricht:

try {
...
} catch (ObjectGridException oe) {
    System.out.println(oe);
}

Ursache für die Ausnahme

Es wird eine Ausnahme des Typs "OptimisticCollisionException" erstellt, wenn zwei verschiedene Clients versuchen, denselben Map-Eintrag fast zur selben Zeit zu aktualisieren. Wenn beispielsweise ein Client versucht, eine Sitzung festzuschreiben und den Map-Eintrag zu aktualisieren, nachdem ein anderer Client die Client die Daten vor dem Festschreiben liest, sind diese Daten falsch. Die Ausnahme wird erstellt, wenn der andere Client versucht, die falschen Daten festzuschreiben.

Schlüssel abrufen, der die Ausnahme ausgelöst hat

Für die Fehlerbehebung einer solchen Ausnahme kann es hilfreich sein, den Schlüssel abzurufen, der dem Eintrag entspricht, der die Ausnahme ausgelöst hat. Der Vorteil der Ausnahme "OptimisticCollisionException" besteht darin, dass sie die Methode "getKey" enthält, die das Objekt zurückgibt, das diesen Schlüssel darstellt. Das folgende Beispiel veranschaulicht, wie der Schlüssel beim Abfangen der Ausnahme "OptimisticCollisionException" abgerufen und ausgegeben wird:

try {
...
} catch (OptimisticCollisionException oce) {
    System.out.println(oce.getKey());
}

ObjectGridException löst eine Ausnahme des Typs "OptimisticCollisionException" aus

Die Ausnahme "OptimisticCollisionException" kann die Ursache für die Anzeige einer Ausnahme des Typs "ObjectGridException" sein. In diesem Fall können Sie den folgenden Code verwenden, um den Ausnahmetyp zu bestimmen und den Schlüssel auszugeben. Im folgenden Code wird das Dienstprogramm "findRootCause" gemäß der Beschreibung im folgenden Abschnitt verwendet:

try {
...
}
catch (ObjectGridException oe) {
    Throwable Root = findRootCause( oe );
    if (Root instanceof OptimisticCollisionException) {
        OptimisticCollisionException oce = (OptimisticCollisionException)Root;
        System.out.println(oce.getKey());
    }
}

Allgemeine Technik für die Behandlung von Ausnahmen

Die eigentliche (Fehler-)Ursache für ein Throwable-Objekt zu kennen, ist für die Eingrenzung der Fehlerquelle hilfreich. Das folgende Codebeispiel zeigt, wie eine Ausnahmebehandlungsroutine eine Dienstprogrammmethode verwendet, um die eigentliche (Fehler-)Ursache für das Throwable-Objekt zu ermitteln.

Beispiel:

static public Throwable findRootCause( Throwable t )
{
     // Mit dem Stamm-Throwable beginnen.
     Throwable root = t;

     // Ursachenkette verfolgen, bis das letzte Throwable-Objekt in der Kette gefunden wird.
     Throwable cause = root.getCause();
     while ( cause != null )
     {
        root = cause;
        cause = root.getCause();
     }

     // Letztes Throwable-Objekt in der Kette als eigentliche (Fehler-)Ursache zurückgeben.
     return root;
}