レスポンスとエラー処理

Snowflake Native SDK for Connectors は、特に UI から使用されるように公開および設計されたプロシージャに対して、特定の標準応答を使用します。さらに、例外が有効な応答にマッピングされ、 EVENT TABLE に記録されるようにする方法も提供します。

応答

SDK プロシージャは、高レベルのものも内部的なものも、情報を渡すために特定の構造の variant を使用します。このような variant の要件は、 response_code フィールドが含まれている必要があります。また、場合によっては、応答コードが必須の message フィールドの OK と異なることがあります。追加のフィールドを含めることもできますが、さらにカスタム処理が必要になります。THe 応答形式は次のとおりです。

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

プロシージャとオブジェクトのデフォルト実装を置き換える場合は、この形式を使用することをお勧めします。

エラー処理

Snowflake Native SDK for Connectors は、実行時に発生する可能性のある例外を処理するための便利なデフォルトメカニズムを提供します。これを担当するクラスは ConnectorErrorHelper と呼ばれ、デフォルトの実装は DefaultConnectorErrorHelper です。この機能は、カスタマイズ可能な2つのコールバックを提供します。最初の ExceptionMapper は、すべての予期せぬエラーを ConnectorException 形式にラッピングする役割を担っています。この機能は、主に応答が上記の形式に準拠していることを確認するために使用されます。

2番目のコールバックである ExceptionLogger は、エラーがログに記録されるようにします。これは、すべての標準ログエントリがSnowflakeによって EVENT TABLE に保存されるため、アプリケーションの問題を解決するときに役立つため重要です。

ヘルパーを使用する方法

ヘルパーは、次の2つのメソッドを公開しています。

  • withExceptionWrapping(Supplier<ConnectorResponse> action)

  • withExceptionLogging(Supplier<T> action)

これらの方法はそれぞれ上記の mapperlogger を使用します。これらのアプローチを組み合わせたヘルパーメソッドのデフォルト実装もあります。

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

handler からメソッドを呼び出すときは、このラッピングを可能な限り高いレベルで使用することをお勧めします。たとえば ConnectionConfigurationHandler では次のように使われます。

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

SDK は、この動作をカスタマイズするための ConnectorErrorHelperBuilder と呼ばれるビルダーも公開します。このビルダーによって、開発者は mapper および logger のコールバックの動作をカスタマイズできます。カスタマイズが完了すると、新しい helper をそれぞれの buildershandler クラスに渡すことができます。例:

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