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

# Gestion des exceptions Python

export const Compatibility = ({versions = [], label = "Available in"}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const defaultPillStyle = {
    borderColor: "#d4d4d8",
    background: "#f4f4f5",
    color: "#3f3f46"
  };
  const pillStyles = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#d8b4fe",
      color: "#6b21a8"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#5eead4",
      color: "#115e59"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#86efac",
      color: "#166534"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#93c5fd",
      color: "#1e40af"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fca5a5",
      color: "#991b1b"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fdba74",
      color: "#9a3412"
    }
  };
  const getPillStyle = name => ({
    ...defaultPillStyle,
    ...pillStyles[name] || ({})
  });
  return <div className="not-prose my-4 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-sm dark:border-white/10 dark:bg-white/5">
      <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
        <span className="font-semibold text-zinc-700 dark:text-zinc-200">
          {label}:
        </span>
        {versions.map((v, i) => <span key={`${v.name}-${v.version}-${i}`} className="inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium" style={getPillStyle(v.name)}>
            <span>{v.name}</span>
            <span className="opacity-70">
              {v.version}
              {v.exact ? "" : "+"}
            </span>
          </span>)}
      </div>
    </div>;
};

AppSignal essaie d'enregistrer autant d'exceptions Python que possible. AppSignal est capable de capturer les exceptions dans toute votre application grâce à [nos instrumentations](/python/instrumentations), qui étendent notre prise en charge à de nombreux frameworks populaires et packages de jobs en arrière-plan.

Cependant, il peut y avoir des scénarios où des exceptions sont levées qui ne sont pas liées à des problèmes potentiels de votre application Python, comme des bots essayant de soumettre automatiquement des formulaires ou des liens obsolètes qui peuvent diriger les visiteurs vers du contenu qui n'existe plus.

Pour éviter que ces erreurs ne soient signalées comme des problèmes dans AppSignal, il est possible d'ajouter la gestion des exceptions à votre code ou même de laisser AppSignal ignorer complètement certaines erreurs.

## Ignorer les erreurs

La configuration AppSignal permet d'[ignorer des erreurs](/guides/filter-data/ignore-errors). En fournissant une liste d'erreurs spécifiques, AppSignal n'enverra pas d'alertes lorsque ces erreurs seront levées.

## Gestion des exceptions

Le simple fait d'ignorer une erreur fera taire les notifications, mais pourrait potentiellement cacher un problème plus important. Pour cette raison, nous vous recommandons d'ajouter la gestion des exceptions avec des instructions `try ... except` à votre application.

À l'aide de `try ... except`, vous pouvez capturer des exceptions spécifiques et ajouter un chemin de code alternatif lorsqu'une exception se produit, comme afficher des pages 404 ou fournir à l'utilisateur des messages d'erreur plus détaillés sur ce qui s'est mal passé.

Par exemple, dans un fichier de vue Django, nous pouvons faire ce qui suit :

<CodeGroup>
  ```python Python theme={null}
  def show(request):
     try:
          user = Post.find(1)
      except RecordNotFound:
          return render(request, "not_found.html")
  ```
</CodeGroup>

Il existe plusieurs scénarios, comme lorsque des ressources n'existent pas ou lorsqu'une soumission de formulaire échoue, qui devraient être gérés ainsi pour fournir des réponses HTTP appropriées à l'utilisateur final.

Si vous souhaitez signaler ces erreurs capturées à AppSignal, utilisez les helpers [`set_error`](#set_error) ou [`send_error`](#send_error).

## set\_error

<Compatibility versions={[{ name: "AppSignal for Python", version: "0.3.0" }]} />

Signalez des erreurs sans qu'elles ne fassent planter votre application. À l'aide du helper `set_error`, l'erreur donnée est définie sur la trace AppSignal, ce qui signale l'erreur sur la trace (requête / job en arrière-plan) à AppSignal.

Si vous souhaitez tout de même suivre l'erreur tout en la capturant, vous pouvez utiliser le helper `set_error` pour ajouter l'exception à la trace AppSignal actuelle. L'erreur sera enregistrée dans AppSignal, mais votre processus ne plantera pas.

Par exemple, dans un fichier de vue Django, nous pouvons faire ce qui suit :

<CodeGroup>
  ```python Python theme={null}
  from appsignal import set_error

  # In a Django view file
  def show(request):
      try:
          user = Post.find(1)
      except Post.DoesNotExist as error:
          set_error(error)
          return render(request, "not_found.html")
  ```
</CodeGroup>

L'exception sera suivie par AppSignal comme n'importe quelle autre erreur, et cela vous permet de fournir une gestion d'erreur personnalisée et des solutions de repli.

<Tip>
  **Note :** Cette méthode ne fonctionne que lorsqu'une trace AppSignal est déjà
  active. Sinon, l'erreur sera ignorée. C'est le cas dans la plupart des
  [instrumentations](/python/instrumentations) automatiquement prises en charge ou lors de
  l'utilisation de l'[instrumentation personnalisée](/python/instrumentation). Veuillez consulter
  [`send_error`](#send_error) pour envoyer des erreurs sans trace AppSignal active.
</Tip>

## send\_error

<Compatibility versions={[{ name: "AppSignal for Python", version: "0.3.0" }]} />

AppSignal fournit un mécanisme pour envoyer des erreurs à AppSignal sans avoir à démarrer une trace. Ceci est utile pour suivre les erreurs qui se produisent dans du code qui ne se trouve pas dans le contexte d'une requête web ou d'un job en arrière-plan, comme des scripts ponctuels ou des cron jobs.

Ceci est utile pour les applications qui n'utilisent pas nos [instrumentations](/python/instrumentations) pour la partie de l'application dans laquelle l'erreur est levée.

Vous pouvez utiliser la méthode `send_error` pour envoyer directement une exception à AppSignal depuis n'importe quel endroit de votre code sans démarrer de trace au préalable.

<CodeGroup>
  ```python Python theme={null}
  from appsignal import send_error

  # In a script
  def perform():
      try:
          user = Post.find(1)
      except Post.DoesNotExist as error:
          send_error(error)
          print("No post found!")
  ```
</CodeGroup>

### Métadonnées supplémentaires

Pour ajouter des métadonnées à l'erreur envoyée, utilisez la méthode `send_error_with_context`. Des [tags](/guides/tagging) et [d'autres types de personnalisation des données](/guides/custom-data) peuvent être ajoutés à l'erreur de cette façon.

<CodeGroup>
  ```python Python theme={null}
  from appsignal import send_error_with_context, set_params

  # In a script
  def perform():
      try:
          user = Post.find(1)
      except Post.DoesNotExist as error:
          # Using implicit current span
          with send_error_with_context(error):
              set_params({"abc": "def"})

          # Using explicit `with` block span
          with send_error_with_context(error) as current_span:
              set_params({"abc": "def"}, current_span)

          print("No post found!")
  ```
</CodeGroup>
