Wie man QR-Code-Fehlermeldungen in C# behandelt
Die Fehlerbehandlung von IronQR hilft Ihnen, Lese- und Schreibfehler zu erkennen, Diagnosedaten zu protokollieren und aus jedem Scan klare Ergebnisse zu erhalten. Wenn Sie keine expliziten Prüfungen hinzufügen, liefern sowohl ein leeres Ergebnis als auch eine beschädigte Datei keine Ergebnisse, sodass Sie nicht wissen, was schiefgelaufen ist. Durch gezielte Ausnahmebehandlung und Diagnoseprotokollierung können Sie unbemerkte Fehler in nützliches Feedback umwandeln. Dieser Leitfaden erklärt, wie man mit leeren Ergebnissen umgeht, Ausnahmen beim Schreiben verwaltet und einen strukturierten Protokollierungs-Wrapper für die Stapelverarbeitung erstellt.
Schnellstart: QR-Code-Fehler behandeln
QR-Code-Lesevorgänge sollten in einen try-catch-Block eingeschlossen und Diagnosen für Datei- und Dekodierungsfehler protokolliert werden.
-
Installieren Sie IronQR mit NuGet Package Manager
PM > Install-Package IronQR -
Kopieren Sie diesen Codeausschnitt und führen Sie ihn aus.
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}"); } -
Bereitstellen zum Testen in Ihrer Live-Umgebung
Beginnen Sie noch heute, IronQR in Ihrem Projekt zu verwenden, mit einer kostenlosen Testversion
Minimaler Arbeitsablauf (5 Schritte)
- Laden Sie die IronQR C#-Bibliothek zur Fehlerbehandlung von QR-Codes herunter.
- QR-Lese-/Schreibaufrufe in try-catch-Blöcke einbetten
- Fangen Sie
IOExceptionundArgumentExceptionfür spezifische Fehler ab. - Protokolldiagnose für leere Ergebnisse und Ausnahmen
- Verwenden Sie strukturiertes JSON-Logging für die Pipeline-Überwachung.
Behandlung von Lesefehlern und leeren Ergebnissen
Ohne Protokollierung erscheinen ein leeres Ergebnis und eine beschädigte Datei für den Aufrufer identisch. Das folgende Beispiel erkennt Dateizugriffsfehler und gibt eine Warnung aus, wenn der Scan keine Ergebnisse liefert.
Eingabe
Dieser QR-Code-Beispiel-Eingabetext ist auf der Festplatte vorhanden. Wir werden beide Szenarien simulieren: eines, in dem der Benutzer die Datei abruft und dekodiert, und ein anderes, in dem der Dateipfad falsch ist.
: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
Ausgabe
Die untenstehende Konsole zeigt [WARN] für den Fall eines leeren Ergebnisses und [ERROR] für die fehlende Datei an, jeweils mit dem Dateipfad und einem Handlungsvorschlag.
Behandlung von Schreibfehlern
Die Übergabe von null an QrWriter.Write löst einen IronQrEncodingException aus. Daten, die die Kapazität für das konfigurierte Fehlerkorrekturniveau überschreiten, werden ebenfalls ausgeworfen, da höhere Korrekturniveaus die verfügbare Datenkapazität verringern.
Eingabe
Die beiden folgenden Eingabevariablen definieren die Fehlerszenarien: nullContent ist null und oversizedContent ist eine 5.000 Zeichen lange Zeichenkette, die die QR-Kapazität auf der höchsten Korrekturstufe überschreitet.
: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
Ausgabe
Die Konsole zeigt den Ausnahmetyp und die Fehlermeldung für beide Fehlerszenarien an.
Protokollieren Sie die Eingabelänge zusammen mit der Fehlermeldung, um festzustellen, ob das Problem einen kürzeren Inhalt oder eine niedrigere Korrekturstufe erfordert. Um den Aufwand für Ausnahmen zu reduzieren und die Diagnose zu verbessern, sollten Benutzereingaben vor der Kodierung auf die Länge der Zeichenkette geprüft und auf Nullwerte untersucht werden.
Protokollierung von QR-Code-Operationen
Verwenden Sie IronSoftware.Logger, um interne Diagnosedaten zu erfassen. Implementieren Sie für jeden Lesevorgang eine Hilfsfunktion, die den Dateipfad, die Anzahl der Ergebnisse und die verstrichene Zeit als JSON protokolliert, um eine übersichtliche Ausgabe für den gesamten Batch zu gewährleisten.
Eingabe
Der Batch enthält vier gültige QR-Code-Bilder von qr-scans/ und eine fünfte Datei, scan-05-broken.png, mit ungültigen Bytes.
Scan 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")
Ausgabe
Die Konsole zeigt JSON-Protokollzeilen für jede Datei an: vier erfolgreiche Lesevorgänge und einen strukturierten Fehlereintrag für die beschädigte Datei, gefolgt von der Batch-Zusammenfassung. IronSoftware.Logger schreibt gleichzeitig interne Diagnosedaten an IronQR-debug.log. Das vollständige Debug-Protokoll können Sie hier herunterladen.
Die JSON-Ausgabe wird direkt in Log-Aggregationstools eingespeist: pipe stdout to Fluentd, Datadog, or CloudWatch in a containerized deployment. Das Feld ms zeigt Latenzregressionen an, und das Debug-Protokoll erfasst interne Verarbeitungsschritte, die der Wrapper nicht erfasst.
Weiterführende Literatur
- Fehlerkorrekturstufen : QR-Fehlertoleranz auf Codierungsebene anpassen.
- Anleitung zum Lesen von QR-Codes : Eine vollständige Schritt-für-Schritt-Anleitung zum Lesen.
- QR-Code-Generator-Tutorial : Generierung mit Styling und Logos.
- QrReader API-Referenz : Methodensignaturen und Anmerkungen.
- QrWriter API-Referenz : alle Write-Überladungen.
Sehen Sie sich die Lizenzoptionen an, wenn Sie bereit für die Produktion sind.

