# Fehler

> VimineError — ein einziger Fehlertyp für alles, was die API und das SDK ablehnen können, mit einem stabilen Code.

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

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

Alles, was schiefgeht, kommt als `VimineError` an, eine Unterklasse von `Error`. **`code`** ist der stabile
Bezeichner, nach dem Sie verzweigen: der `code` eines problem+json-Dokuments (RFC 9457), der `error` einer OAuth-Antwort
oder einer der eigenen Codes des SDK.

## Eigenschaften

| | Typ | |
|---|---|---|
| `code` | `string` | der stabile Code |
| `message` | `string` | `detail` oder `title` des Problems oder `error_description` |
| `status` | `number \| null` | der HTTP-Status, `null` bei lokalen Fehlern |
| `requestId` | `string \| null` | die `request_id` der Antwort: Nennen Sie sie in Meldungen |
| `detail` | `string \| null` | das `detail` des Problems |
| `errors` | `FieldError[]` — `{ field?, code?, message? }` | die Einzelheiten zu `validation_failed` und zu `identification_required`; ein Eintrag `codicefiscale_mismatch` enthält außerdem `mismatches`, `hints` und `confirmable` ([Anleitung](https://developers.vimine.network/de/guides/members-without-cf/#eine-abweichende-steuernummer-und-die-bestätigung)) |
| `cause` | `unknown` | der zugrunde liegende Fehler (`network`, `framed`) |
| `isAuthError` | `boolean` | `true` für „Die Sitzung ist weg: Neu anmelden“ (401, `invalid_token`, `token_expired`, `missing_token`, `invalid_grant`, `not_signed_in`) |

## Die Codes des SDK

| `code` | Wann |
|---|---|
| `invalid_options` | Konstruktor ohne `clientId`, `redirectUri` oder `clientSecret` |
| `network` | die Anfrage hat die API nicht erreicht (`cause` enthält den ursprünglichen Fehler) |
| `not_signed_in` | keine Sitzung oder kein Refresh-Token für einen authentifizierten Aufruf |
| `no_flow` | eine Rückkehr ohne eine Anmeldung, die in diesem Browser gestartet wurde (Speicher leer oder abgelaufen) |
| `state_mismatch` | die Rückkehr passt nicht zur gestarteten Anmeldung |
| `framed` | `signIn()` aus einem Cross-Origin-Frame |
| `http_<status>` | eine Fehlerantwort ohne erkennbaren JSON-Body |

Die Codes der **API** (`insufficient_scope`, `not_found`, `validation_failed`, `statuto_required`, `rate_limited`,
…) und die von **OAuth** (`invalid_grant`, `access_denied`, `unauthorized_client`, …) stehen in
[Berechtigungen, Fehler und Limits](https://developers.vimine.network/de/guides/scopes-and-errors/).

## Behandlung

```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(`Eine neuere Version ist in Kraft: ${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);
    }
}
```
