> ## Documentation Index
> Fetch the complete documentation index at: https://docs.markpdf.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Manejo de errores

> MarkpdfClientError, el interceptor de errores y estrategia de reintento en Angular.

# Manejo de errores

`MarkpdfService` propaga errores como el Angular estándar `HttpErrorResponse`, a menos que registre `markpdfErrorInterceptor` (consulte la [Guía del marco](/docs/public/es/sdks/angular/framework-guide#error-interceptor)), en cuyo caso los normaliza a `MarkpdfClientError`.

## Sin interceptor: `HttpErrorResponse`

```ts theme={null}
this.markpdf.convertFile(file, { mode: "fast" }).subscribe({
  next: (markdown) => this.markdown.set(markdown as string),
  error: (err: HttpErrorResponse) => {
    console.error(err.status, err.error); // err.error es el body { error: string } de tu backend
  },
});
```

## Con `markpdfErrorInterceptor`: `MarkpdfClientError`

```ts theme={null}
import { markpdfErrorInterceptor, MarkpdfClientError } from "@markpdf/angular";
import { provideHttpClient, withInterceptors } from "@angular/common/http";

provideHttpClient(withInterceptors([markpdfErrorInterceptor]));
```

```ts theme={null}
this.markpdf.convertFile(file, { mode: "fast" }).subscribe({
  next: (markdown) => this.markdown.set(markdown as string),
  error: (err: MarkpdfClientError) => {
    switch (err.kind) {
      case "rate-limit":
        this.showToast("Too many requests, retry in a few seconds.");
        break;
      case "payload-too-large":
        this.showToast("The file is too large.");
        break;
      case "vavalidation":
        this.showToast("Invalid file.");
        break;
      default:
        this.showToast("Could not convert the document.");
    }
  },
});
```

## tabla `kind`

| Estado HTTP (desde su backend) | `MarkpdfClientError.kind` | Causa típica                                                 |
| -----------------------------: | ------------------------- | ------------------------------------------------------------ |
|                          `400` | `"bad-request"`           | Cuerpo inválido o URL malformado.                            |
|                  `401` / `403` | `"forbidden"`             | Problema de configuración con su backend, no con el usuario. |
|                          `413` | `"payload-too-large"`     | Documento demasiado grande.                                  |
|                          `415` | `"unsupported-media"`     | Formato no compatible.                                       |
|                          `422` | `"vavalidation"`          | Faltan parámetros.                                           |
|                          `429` | `"rate-limit"`            | Demasiadas peticiones.                                       |
|                          `5xx` | `"server-error"`          | Error de conversión o su servidor proxy.                     |
|                        — (red) | `"network"`               | Sin conexión, CORS, o backend inactivo.                      |

```ts theme={null}
class MarkpdfClientError extends Error {
  kind: "bad-request" | "forbidden" | "payload-too-large" | "unsupported-media" |
        "vavalidation" | "rate-limit" | "server-error" | "network";
  statusCode: number | null;
  detail: string;
}
```

<Note>
  `"forbidden"` cubre tanto `401` como `403` porque, desde el punto de vista del usuario final de su aplicación Angular, ambos significan lo mismo: su backend no pudo autenticarse contra API. El usuario no puede solucionarlo; es un problema de configuración de su parte.
</Note>

## Reintentos

`@markpdf/angular` no reintenta automáticamente por sí solo; delega esa responsabilidad al SDK que usas en tu backend (Node.js, Python, C++...), que sí tiene reintentos configurables. Consulte [Node.js SDK Manejo de errores](/docs/public/es/sdks/nodejs/error-handling#reintentos-automáticos) para conocer el patrón recomendado del lado del servidor.

Si necesita volver a intentarlo desde Angular (por ejemplo, una llamada `429` a su backend), use los operadores RxJS estándar:

```ts theme={null}
import { retry, timer } from "rxjs";

this.markpdf.convertFile(file, { mode: "fast" }).pipe(
  retry({
    count: 3,
    delay: (error, retryCount) => {
      if (error.status !== 429) throw error; // only retries 429
      return timer(2 ** retryCount * 1000);
    },
  })
).subscribe(/* ... */);
```

<Tip />
