Antworten und Fehlerbehandlung

Die Website Snowflake Native SDK for Connectors verwendet bestimmte Standardantworten, insbesondere für Prozeduren, die über die UI zugänglich sind und verwendet werden können. Darüber hinaus bietet es eine Möglichkeit, um sicherzustellen, dass Ausnahmen gültigen Antworten zugeordnet und in EVENT TABLE protokolliert werden.

Antworten

Die SDK-Prozeduren, sowohl die allgemeinen Prozeduren als auch die internen, verwenden variant-Werte mit einer bestimmten Struktur, um Informationen zu übergeben. Die Voraussetzung für eine solchen variant-Wert ist, dass er ein response_code-Feld enthalten muss, und in einigen Fällen ist der Antwortcode im erforderlichen message-Feld ein anderer als OK. Jedes zusätzliche Feld kann eingefügt werden, erfordert aber eine weitere kundenspezifische Verarbeitung. Das Antwortformat ist wie folgt:

{
    "response_code": "<response code>",
    "message": "<message>"
}
Copy

Es wird empfohlen, dieses Format zu verwenden, wenn Sie die Standardimplementierungen der Prozeduren und Objekte ersetzen.

Fehlerbehandlung

Das Snowflake Native SDK for Connectors bietet einen nützlichen Standardmechanismus zur Behandlung von Ausnahmen, die während der Laufzeit auftreten können. Die Klasse, die dafür zuständig ist, heißt ConnectorErrorHelper und ihre Standardimplementierung ist DefaultConnectorErrorHelper. Dieses Feature bietet zwei anpassbare Callbacks. Der erste Callback ist ExceptionMapper. Er ist dafür verantwortlich, alle unerwarteten Fehler in das Format ConnectorException zu packen. Dieses Feature wird hauptsächlich verwendet, um sicherzustellen, dass die Antworten mit dem oben genannten Format übereinstimmen.

Der zweite Callback mit dem Namen ExceptionLogger sorgt dafür, dass der Fehler protokolliert wird. Dies ist wichtig, da alle Standardprotokolleinträge dann von Snowflake in der EVENT TABLE gespeichert werden, was bei der Lösung von Problemen mit den Anwendungen hilfreich ist.

Verwenden der Helper-Klasse

Die Helper-Klasse stellt zwei Methoden zur Verfügung:

  • withExceptionWrapping(Supplier<ConnectorResponse> action)

  • withExceptionLogging(Supplier<T> action)

Diese Methoden verwenden die oben erwähnten mapper und logger. Es gibt auch eine Standard-Implementierung einer Helper-Methode, die diese Ansätze miteinander vermischt:

default ConnectorResponse withExceptionLoggingAndWrapping(Supplier<ConnectorResponse> action) {
    return withExceptionWrapping(() -> withExceptionLogging(action));
}
Copy

Es wird empfohlen, dieses Wrapping auf der höchstmöglichen Ebene zu verwenden, wenn Sie eine Methode von einem handler aufrufen. In ConnectionConfigurationHandler wird es zum Beispiel wie folgt verwendet:

public static Variant setConnectionConfiguration(Session session, Variant configuration) {
    var handler = ConnectionConfigurationHandler.builder(session).build();
    return handler.setConnectionConfiguration(configuration).toVariant();
}

public ConnectorResponse setConnectionConfiguration(Variant configuration) {
    return errorHelper.withExceptionLoggingAndWrapping(
        () -> setConnectionConfigurationBody(configuration)
    );
}
Copy

Das SDK stellt auch einen Builder zur Verfügung, mit dem Sie dieses Verhalten anpassen können: ConnectorErrorHelperBuilder. Dieser Builder ermöglicht es dem Entwickler, das Verhalten der mapper- und logger-Callbacks anzupassen. Einmal angepasst, kann der neue helper an die handler-Klassen in ihren jeweiligen builders übergeben werden. Beispiel:

class CustomUnknownExceptionMapper implements ExceptionMapper<Exception> {

    @Override
    public ConnectorException map(Exception exception) {
        return new CustomConnectorException(exception);
    }
}

class CustomHandler {

    // Path to this method needs to be specified in the PUBLIC.SET_CONNECTION_CONFIGURATION procedure using SQL
    public static Variant configureConnection(Session session, Variant configuration) {
            //Using builder
        var errorHelper = new ConnectorErrorHelperBuilder()
            .withConnectorExceptionLogger(new CustomUnknownExceptionMapper())
            .build();

        var handler = ConnectionConfigurationHandler.builder(session)
            .withErrorHelper(errorHelper)
            .build();

        return handler.connectionConfiguration(configuration).toVariant();
    }
}
Copy