# Erreurs

> VimineError — un seul type d’erreur pour tout ce que l’API et le SDK peuvent refuser, avec un code stable.

URL: https://developers.vimine.network/fr/sdk/errors/

```js
import { VimineError } from '@vimine/sdk';   // aussi depuis /server
```

Tout ce qui tourne mal arrive sous forme de `VimineError`, une sous-classe de `Error`. **`code`** est l’identifiant
stable sur lequel brancher votre logique : le `code` d’un document problem+json (RFC 9457), l’`error` d’une réponse
OAuth, ou l’un des codes propres au SDK.

## Propriétés

| | Type | |
|---|---|---|
| `code` | `string` | le code stable |
| `message` | `string` | le `detail` ou le `title` du problème, ou `error_description` |
| `status` | `number \| null` | le statut HTTP, `null` pour les erreurs locales |
| `requestId` | `string \| null` | le `request_id` de la réponse : citez-le dans vos signalements |
| `detail` | `string \| null` | le `detail` du problème |
| `errors` | `FieldError[]` — `{ field?, code?, message? }` | les détails de `validation_failed` et de `identification_required` ; une entrée `codicefiscale_mismatch` porte aussi `mismatches`, `hints` et `confirmable` ([guide](https://developers.vimine.network/fr/guides/members-without-cf/#un-code-en-désaccord-et-la-confirmation)) |
| `cause` | `unknown` | l’erreur sous-jacente (`network`, `framed`) |
| `isAuthError` | `boolean` | `true` pour « la session n’existe plus : reconnectez-vous » (401, `invalid_token`, `token_expired`, `missing_token`, `invalid_grant`, `not_signed_in`) |

## Les codes du SDK

| `code` | Quand |
|---|---|
| `invalid_options` | constructeur sans `clientId`, `redirectUri` ou `clientSecret` |
| `network` | la requête n’a pas atteint l’API (`cause` porte l’erreur d’origine) |
| `not_signed_in` | pas de session, ou pas de jeton de rafraîchissement, pour un appel authentifié |
| `no_flow` | un retour sans connexion lancée depuis ce navigateur (stockage vide ou expiré) |
| `state_mismatch` | le retour ne correspond pas à la connexion qui a été lancée |
| `framed` | `signIn()` depuis un cadre d’une autre origine |
| `http_<status>` | une réponse d’erreur sans corps JSON reconnaissable |

Les codes de l’**API** (`insufficient_scope`, `not_found`, `validation_failed`, `statuto_required`, `rate_limited`,
…) et ceux d’**OAuth** (`invalid_grant`, `access_denied`, `unauthorized_client`, …) se trouvent dans
[Autorisations, erreurs et limites](https://developers.vimine.network/fr/guides/scopes-and-errors/).

## Les gérer

```js
import { VimineError } from '@vimine/sdk';

try {
    await vimine.membership.acceptStatuto({ version });
} catch (err) {
    if (!(err instanceof VimineError)) throw err;
    if (err.isAuthError) return vimine.signIn({ returnTo: location.pathname });
    switch (err.code) {
        case 'statuto_outdated':  return alert(`Une version plus récente est en vigueur : ${err.detail}`);
        case 'insufficient_scope': return vimine.signIn({ scopes: ['statuto:accept'], prompt: 'consent' });
        case 'rate_limited':      return setTimeout(retry, 5000);
        default:                  console.error(err.code, err.requestId);
    }
}
```
