Comment gérer les messages d'erreur des codes QR en C
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.
-
Installez IronQR avec le Gestionnaire de Packages NuGet
PM > Install-Package IronQR -
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}"); } -
Déployez pour tester sur votre environnement de production.
Commencez à utiliser IronQR dans votre projet dès aujourd'hui avec un essai gratuit
Flux de travail minimal (5 étapes)
- Téléchargez la bibliothèque IronQR C# pour la gestion des erreurs de code QR
- Encapsulez les appels de lecture/écriture QR dans des blocs try-catch
- Attrapez
IOExceptionetArgumentExceptionpour des erreurs spécifiques - Journalisez les diagnostics pour les résultats vides et les exceptions
- Utilisez la journalisation JSON structurée pour l'observabilité des pipelines
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.
: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
Sortie
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.
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
Sortie
La console affiche le type d'exception et le message pour les deux scénarios d'échec.
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.
Numérisation 1
Scan 2
Scan 3
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")
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.
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
- Niveaux de correction d'erreurs : ajustez la résilience des QR codes au niveau de l'encodage.
- Comment lire les codes QR : guide de lecture complet.
- Tutoriel sur le générateur de codes QR : génération avec style et logos.
- Référence de l'API QrReader : signatures des méthodes et remarques.
- Référence de l'API QrWriter : toutes les surcharges d'écriture.
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.

