Documentation
Erreurs

Erreurs

Lorsqu'une erreur survient dans un processus, SecrecyClient lance une « erreur ». Cette contient toutes les informations dont vous avez besoin pour gérer l'erreur dans le client. Le SecrecyClient définit une liste de codes d'erreur qui représentent chacun un type d'erreur.

Codes d'erreur

Une SecrecyError est un objet simple, et non une instance d'Error. Elle est discriminée par sa propriété name : une ClientError est levée par la bibliothèque elle-même, une ServerError provient de l'API Secrecy.

errors.ts
// Thrown by the library itself
type ClientError = {
  name: 'ClientError';
  code: 'NOT_FOUND';
  message: string;
};
 
// Forwarded from the Secrecy API
type ServerError = {
  name: 'TRPCError';
  code:
    | 'PARSE_ERROR'
    | 'BAD_REQUEST'
    | 'INTERNAL_SERVER_ERROR'
    | 'NOT_IMPLEMENTED'
    | 'UNAUTHORIZED'
    | 'FORBIDDEN'
    | 'NOT_FOUND'
    | 'METHOD_NOT_SUPPORTED'
    | 'TIMEOUT'
    | 'CONFLICT'
    | 'PRECONDITION_FAILED'
    | 'PAYLOAD_TOO_LARGE'
    | 'UNPROCESSABLE_CONTENT'
    | 'TOO_MANY_REQUESTS'
    | 'CLIENT_CLOSED_REQUEST';
  message: string;
  data?: unknown;
};
 
type SecrecyError = ClientError | ServerError;

Gestion des erreurs

Comme vous pouvez le voir dans notre exemple, si une erreur se produit pendant l'appel, la fonction vérifie si l'erreur est une SecrecyError en utilisant la fonction d'aide isSecrecyError. Si tel est le cas, vous pouvez accéder aux propriétés code, message et name de l'erreur, ce qui peut faciliter le débogage des problèmes liés à l'appel à l'API. La propriété name permet de distinguer les deux types d'erreur. Les gardes dédiées isClientError et isServerError ne sont pas exposées à la racine du paquet : importez-les depuis @secrecy/lib/error/client et @secrecy/lib/error/server.

errors.ts
import { isSecrecyError } from '@secrecy/lib';
 
const handlingSecrecyError = async (): Promise<SelfUser | undefined> => {
  if (!secrecyClient) {
    throw 'No client';
  }
 
  try {
    // whatever the Secrecy methods
    const user = await secrecyClient.me();
    return user;
  } catch (e) {
    // Check if the error is a SecrecyError
    if (isSecrecyError(e)) {
      const { message, code, name } = e;
      console.error({ message, code, name });
    }
 
    // Narrow it down further when needed
    if (
      isSecrecyError(e) &&
      e.name === 'TRPCError' &&
      e.code === 'UNAUTHORIZED'
    ) {
      // the session is no longer valid
    }
  }
};