Comment gérer les messages d'erreur des codes QR en C

This article was translated from English: Does it need improvement?
Translated
View the article in English

La gestion des erreurs d'IronQR vous aide à détecter les échecs de lecture et d'écriture, à consigner les diagnostics et à obtenir des résultats clairs pour chaque analyse. Si vous n'ajoutez pas de vérifications explicites, un résultat vide comme un fichier corrompu ne renverront rien, vous ne saurez donc pas ce qui s'est mal passé. En ajoutant une gestion ciblée des exceptions et une journalisation des diagnostics, vous pouvez transformer les défaillances silencieuses en retours d'information utiles. Ce guide explique comment gérer les résultats vides, gérer les exceptions d'écriture et créer un wrapper de journalisation structurée pour le traitement par lots.

Démarrage rapide : Gérer les erreurs de code QR

Encapsulez les opérations de lecture QR dans un bloc try-catch et journalisez les diagnostics pour les défaillances de fichier et de décodage.

  1. Installez IronQR avec le Gestionnaire de Packages NuGet

    PM > Install-Package IronQR
  2. Copiez et exécutez cet extrait de code.

    using IronQr;
    using IronSoftware.Drawing;
    
    try
    {
        var input = new QrImageInput(AnyBitmap.FromFile("label.png"));
        var results = new QrReader().Read(input);
        Console.WriteLine($"Found {results.Count()} QR code(s)");
    }
    catch (IOException ex)
    {
        Console.Error.WriteLine($"File error: {ex.Message}");
    }
  3. Déployez pour tester sur votre environnement de production.

    Commencez à utiliser IronQR dans votre projet dès aujourd'hui avec un essai gratuit

    arrow pointer

Gestion des erreurs de lecture et des résultats vides

Sans journalisation, un résultat vide et un fichier corrompu apparaissent identiques à l'appelant. L'exemple suivant détecte les échecs d'accès aux fichiers et émet un avertissement si l'analyse ne renvoie aucun résultat.

Entrée

Cet exemple de saisie QR existe sur disque. Nous allons simuler les deux scénarios : l'un où l'utilisateur récupère et décode le fichier, et l'autre où le chemin d'accès au fichier est incorrect.

Encodage de code QR valide : https://ironsoftware.com/qr/scan-1
:path=/static-assets/qr/content-code-examples/how-to/detailed-error-messages/read-diagnostics.cs
using IronQr;
using IronSoftware.Drawing;

string filePath = "damaged-scan.png";

try
{
    // File-level failure throws IOException or FileNotFoundException
    var inputBmp = AnyBitmap.FromFile(filePath);
    var imageInput = new QrImageInput(inputBmp);

    var reader = new QrReader();
    IEnumerable<QrResult> results = reader.Read(imageInput);

    if (!results.Any())
    {
        // Not an exception — but a diagnostic event worth logging
        Console.Error.WriteLine($"[WARN] No QR codes found in: {filePath}");
        Console.Error.WriteLine($"  Action: Verify image quality or try a different scan");
    }
    else
    {
        foreach (QrResult result in results)
        {
            Console.WriteLine($"[{result.QrType}] {result.Value}");
        }
    }
}
catch (FileNotFoundException)
{
    Console.Error.WriteLine($"[ERROR] File not found: {filePath}");
}
catch (IOException ex)
{
    Console.Error.WriteLine($"[ERROR] Cannot read file: {filePath} — {ex.Message}");
}
catch (Exception ex)
{
    Console.Error.WriteLine($"[ERROR] Unexpected failure reading {filePath}: {ex.GetType().Name} — {ex.Message}");
}
Imports IronQr
Imports IronSoftware.Drawing

Module Module1
    Sub Main()
        Dim filePath As String = "damaged-scan.png"

        Try
            ' File-level failure throws IOException or FileNotFoundException
            Dim inputBmp = AnyBitmap.FromFile(filePath)
            Dim imageInput = New QrImageInput(inputBmp)

            Dim reader = New QrReader()
            Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)

            If Not results.Any() Then
                ' Not an exception — but a diagnostic event worth logging
                Console.Error.WriteLine($"[WARN] No QR codes found in: {filePath}")
                Console.Error.WriteLine("  Action: Verify image quality or try a different scan")
            Else
                For Each result As QrResult In results
                    Console.WriteLine($"[{result.QrType}] {result.Value}")
                Next
            End If
        Catch ex As FileNotFoundException
            Console.Error.WriteLine($"[ERROR] File not found: {filePath}")
        Catch ex As IOException
            Console.Error.WriteLine($"[ERROR] Cannot read file: {filePath} — {ex.Message}")
        Catch ex As Exception
            Console.Error.WriteLine($"[ERROR] Unexpected failure reading {filePath}: {ex.GetType().Name} — {ex.Message}")
        End Try
    End Sub
End Module
$vbLabelText   $csharpLabel

Sortie

Affichage du terminal : [QRCode] https://ironsoftware.com/qr/scan-1 pour une lecture de code QR réussie

Veuillez noterUne lecture réussie renverrait simplement la valeur du code QR, tandis qu'une erreur lors de l'exécution afficherait le message d'exception ou les avertissements ci-dessous.

La console ci-dessous affiche un [WARN] pour le cas d'un résultat vide et un [ERROR] pour le fichier manquant, avec le chemin d'accès au fichier et une action suggérée pour chacun.

Sortie du terminal affichant un AVERTISSEMENT : aucun code QR trouvé dans damage-scan.png et une ERREUR : fichier introuvable pour missing-label.png

Gestion des échecs d'écriture

Le passage de null à QrWriter.Write déclenche un IronQrEncodingException. Les données qui dépassent la capacité du niveau de correction d'erreurs configuré génèrent également une erreur, car des niveaux de correction plus élevés réduisent la capacité de données disponible.

Entrée

Les deux variables d'entrée ci-dessous définissent les scénarios d'échec : nullContent est null et oversizedContent est une chaîne de 5 000 caractères qui dépasse la capacité du QR au niveau de correction le plus élevé.

:path=/static-assets/qr/content-code-examples/how-to/detailed-error-messages/write-diagnostics.cs
using IronQr;

string? content = null; // null throws IronQrEncodingException 
string oversizedContent = new string('A', 5000); // 5,000 chars exceeds QR capacity at Highest error correction level 

// Scenario 1: null input
try
{   
    QrCode qr = QrWriter.Write(content); // Input
}
catch (Exception ex)
{
    Console.Error.WriteLine($"[ERROR] Null content: {ex.GetType().Name} — {ex.Message}"); // Output
}

// Scenario 2: data exceeds QR capacity at the configured error correction level
try
{
    var options = new QrOptions(QrErrorCorrectionLevel.Highest);
    QrCode qr = QrWriter.Write(oversizedContent, options); // Input
}
catch (Exception ex)
{
    Console.Error.WriteLine($"[ERROR] QR capacity exceeded: {ex.Message}"); // Output
    Console.Error.WriteLine($"  Input length: {oversizedContent.Length} chars");
    Console.Error.WriteLine($"  Action: Reduce content or lower error correction level");
}
Imports IronQr

Dim content As String = Nothing ' Nothing throws IronQrEncodingException 
Dim oversizedContent As String = New String("A"c, 5000) ' 5,000 chars exceeds QR capacity at Highest error correction level 

' Scenario 1: null input
Try
    Dim qr As QrCode = QrWriter.Write(content) ' Input
Catch ex As Exception
    Console.Error.WriteLine($"[ERROR] Null content: {ex.GetType().Name} — {ex.Message}") ' Output
End Try

' Scenario 2: data exceeds QR capacity at the configured error correction level
Try
    Dim options As New QrOptions(QrErrorCorrectionLevel.Highest)
    Dim qr As QrCode = QrWriter.Write(oversizedContent, options) ' Input
Catch ex As Exception
    Console.Error.WriteLine($"[ERROR] QR capacity exceeded: {ex.Message}") ' Output
    Console.Error.WriteLine($"  Input length: {oversizedContent.Length} chars")
    Console.Error.WriteLine("  Action: Reduce content or lower error correction level")
End Try
$vbLabelText   $csharpLabel

Sortie

La console affiche le type d'exception et le message pour les deux scénarios d'échec.

Sortie du terminal affichant une exception IronQrEncodingException pour un contenu nul transmis à QrWriter.Write

Consignez la longueur de l'entrée avec le message d'exception afin d'identifier si le problème nécessite un contenu plus court ou un niveau de correction inférieur. Pour les entrées utilisateur, validez la longueur de la chaîne et vérifiez les valeurs nulles avant l'encodage afin de réduire la surcharge liée aux exceptions et d'améliorer les diagnostics.


Enregistrement des opérations de code QR

Utilisez IronSoftware.Logger pour capturer les diagnostics internes. Pour chaque opération de lecture, implémentez une fonction auxiliaire qui enregistre le chemin du fichier, le nombre de résultats et le temps écoulé au format JSON afin de garantir une sortie claire pour l'ensemble du lot.

Entrée

Le lot comprend quatre images de codes QR valides provenant de qr-scans/ et un cinquième fichier, scan-05-broken.png, contenant des octets invalides.

QR code encoding https://ironsoftware.com/qr/scan-1
QR code encoding https://ironsoftware.com/qr/scan-2
QR code encoding https://ironsoftware.com/qr/scan-3
QR code encoding https://ironsoftware.com/qr/scan-4
:path=/static-assets/qr/content-code-examples/how-to/detailed-error-messages/logging-wrapper.cs
using IronQr;
using IronSoftware.Drawing;
using System.Diagnostics;

// Enable shared Iron Software logging for internal diagnostics
IronSoftware.Logger.LoggingMode = IronSoftware.Logger.LoggingModes.All;
IronSoftware.Logger.LogFilePath = "ironqr-debug.log";

// Reusable wrapper for structured observability
(IEnumerable<QrResult> Results, bool Success, string Error) ReadQrWithDiagnostics(string filePath)
{
    var sw = Stopwatch.StartNew();
    try
    {
        var input = new QrImageInput(AnyBitmap.FromFile(filePath));
        var results = new QrReader().Read(input).ToList();
        sw.Stop();

        Console.WriteLine($"{{\"op\":\"qr_read\",\"file\":\"{Path.GetFileName(filePath)}\","
            + $"\"status\":\"ok\",\"count\":{results.Count},\"ms\":{sw.ElapsedMilliseconds}}}");

        return (results, true, null);
    }
    catch (Exception ex)
    {
        sw.Stop();
        string error = $"{ex.GetType().Name}: {ex.Message}";

        Console.Error.WriteLine($"{{\"op\":\"qr_read\",\"file\":\"{Path.GetFileName(filePath)}\","
            + $"\"status\":\"error\",\"exception\":\"{ex.GetType().Name}\","
            + $"\"message\":\"{ex.Message}\",\"ms\":{sw.ElapsedMilliseconds}}}");

        return (Enumerable.Empty<QrResult>(), false, error);
    }
}

// Usage: process a batch with per-file isolation
string[] files = Directory.GetFiles("qr-scans/", "*.png");
int ok = 0, fail = 0;

foreach (string file in files)
{
    var (results, success, error) = ReadQrWithDiagnostics(file);
    if (success && results.Any()) ok++;
    else fail++;
}

Console.WriteLine($"\nBatch complete: {ok} success, {fail} failed/empty out of {files.Length} files");
Imports IronQr
Imports IronSoftware.Drawing
Imports System.Diagnostics
Imports System.IO
Imports System.Linq

' Enable shared Iron Software logging for internal diagnostics
IronSoftware.Logger.LoggingMode = IronSoftware.Logger.LoggingModes.All
IronSoftware.Logger.LogFilePath = "ironqr-debug.log"

' Reusable wrapper for structured observability
Private Function ReadQrWithDiagnostics(ByVal filePath As String) As (IEnumerable(Of QrResult), Boolean, String)
    Dim sw = Stopwatch.StartNew()
    Try
        Dim input = New QrImageInput(AnyBitmap.FromFile(filePath))
        Dim results = New QrReader().Read(input).ToList()
        sw.Stop()

        Console.WriteLine($"{{""op"":""qr_read"",""file"":""{Path.GetFileName(filePath)}"",""status"":""ok"",""count"":{results.Count},""ms"":{sw.ElapsedMilliseconds}}}")

        Return (results, True, Nothing)
    Catch ex As Exception
        sw.Stop()
        Dim error As String = $"{ex.GetType().Name}: {ex.Message}"

        Console.Error.WriteLine($"{{""op"":""qr_read"",""file"":""{Path.GetFileName(filePath)}"",""status"":""error"",""exception"":""{ex.GetType().Name}"",""message"":""{ex.Message}"",""ms"":{sw.ElapsedMilliseconds}}}")

        Return (Enumerable.Empty(Of QrResult)(), False, error)
    End Try
End Function

' Usage: process a batch with per-file isolation
Dim files As String() = Directory.GetFiles("qr-scans/", "*.png")
Dim ok As Integer = 0, fail As Integer = 0

For Each file As String In files
    Dim result = ReadQrWithDiagnostics(file)
    Dim results = result.Item1
    Dim success = result.Item2
    Dim error = result.Item3

    If success AndAlso results.Any() Then
        ok += 1
    Else
        fail += 1
    End If
Next

Console.WriteLine($"\nBatch complete: {ok} success, {fail} failed/empty out of {files.Length} files")
$vbLabelText   $csharpLabel

Sortie

La console affiche les lignes de journal JSON pour chaque fichier : quatre lectures réussies et une entrée d'erreur structurée pour le fichier corrompu, suivies du résumé du lot. IronSoftware.Logger écrit des diagnostics internes dans IronQR-debug.log en même temps. Vous pouvez télécharger le journal de débogage complet ici.

Sortie du terminal affichant les lignes de journal structurées au format JSON pour 4 lectures réussies et 1 erreur, Plus résumé de la fin du traitement par lots.

Le flux JSON est directement transmis aux outils d'agrégation de logs : redirigez stdout vers Fluentd, Datadog ou CloudWatch dans un déploiement conteneurisé. Le champ ms met en évidence les régressions de latence, et le journal de débogage capture les étapes de traitement internes que le wrapper ne capture pas.


Lecture supplémentaire

Consultez les options de licence lorsque vous serez prêt pour la production.

Cliquez ici pour télécharger le projet complet d'application console DetailedErrorMessagesTest.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite
Prêt à commencer?
Nuget Téléchargements 63,625 | Version : 2026.4 vient de sortir
Still Scrolling Icon

Vous faites encore défiler ?

Vous voulez une preuve rapidement ? PM > Install-Package IronQR
exécuter un échantillon regarder votre URL devenir un code QR.