Jak radzić sobie z komunikatami o błędach kodów QR w języku C
Obsługa błędów w IronQR pomaga wykrywać błędy odczytu i zapisu, rejestrować diagnostykę oraz uzyskiwać jasne wyniki każdego skanowania. Jeśli nie dodasz wyraźnych sprawdzeń, zarówno pusty wynik, jak i uszkodzony plik nie zwrócą żadnego wyniku, więc nie będziesz wiedzieć, co poszło nie tak. Dodając ukierunkowaną obsługę wyjątków i rejestrowanie diagnostyczne, można zamienić ciche awarie w przydatne informacje zwrotne. W niniejszym przewodniku wyjaśniono, jak radzić sobie z pustymi wynikami, zarządzać wyjątkami w czasie zapisu oraz tworzyć strukturalną nakładkę do logowania na potrzeby przetwarzania wsadowego.
Szybki start: Obsługa błędów kodów QR
Operacje odczytu QR należy umieścić w bloku try-catch i rejestrować diagnostykę dotyczącą błędów związanych z plikami i dekodowaniem.
-
Install IronQR with NuGet Package Manager
PM > Install-Package IronQR -
Skopiuj i uruchom ten fragment kodu.
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}"); } -
Wdrożenie do testowania w środowisku produkcyjnym
Rozpocznij używanie IronQR w swoim projekcie już dziś z darmową wersją próbną
Minimalny proces (5 kroków)
- Pobierz bibliotekę IronQR C# do obsługi błędów kodów QR
- Owiń wywołania odczytu/zapisu QR w bloki try-catch
- Przechwytuj
wyjątki IOExceptioniArgumentExceptiondla konkretnych błędów - Rejestruj diagnostykę pustych wyników i wyjątków
- Użyj strukturalnego logowania JSON do obserwowalności potoku
Obsługa błędów odczytu i pustych wyników
Bez logowania pusty wynik i uszkodzony plik wyglądają identycznie dla wywołującego. Poniższy przykład wykrywa błędy dostępu do plików i wyświetla ostrzeżenie, jeśli skanowanie nie przyniesie żadnych wyników.
Dane wejściowe
Ten przykładowy wpis QR znajduje się na dysku. Zsymulujemy oba scenariusze: jeden, w którym użytkownik pobiera i dekoduje plik, oraz drugi, w którym ścieżka do pliku jest nieprawidłowa.
: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
Wynik
Konsola poniżej pokazuje [WARN] dla przypadku bez wyniku i [ERROR] dla brakującego pliku, z ścieżką do pliku oraz sugerowanym działaniem dla każdego przypadku.
Obsługa błędów zapisu
Przekazanie null do QrWriter.Write wywołuje IronQrEncodingException. Dane, które przekraczają pojemność dla skonfigurowanego poziomu korekcji błędów, również powodują błąd, ponieważ wyższe poziomy korekcji zmniejszają dostępną pojemność danych.
Dane wejściowe
Dwie poniższe zmienne wejściowe definiują scenariusze niepowodzenia: nullContent to null, a oversizedContent to łańcuch znaków o długości 5 000 znaków, przekraczający pojemność QR na najwyższym poziomie korekcji.
: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
Wynik
Konsola wyświetla typ wyjątku i komunikat dla obu scenariuszy awarii.
Zapisz długość danych wejściowych wraz z komunikatem o błędzie, aby określić, czy problem wymaga skrócenia treści, czy też obniżenia poziomu korekty. W przypadku danych wprowadzanych przez użytkownika należy sprawdzić długość ciągu znaków i obecność wartości null przed kodowaniem, aby zmniejszyć obciążenie związane z wyjątkami i poprawić diagnostykę.
Rejestrowanie operacji związanych z kodami QR
Użyj IronSoftware.Logger do przechwytywania wewnętrznych diagnostyk. Dla każdej operacji odczytu zaimplementuj funkcję pomocniczą, która rejestruje ścieżkę pliku, liczbę wyników i czas, jaki upłynął, w formacie JSON, aby zapewnić przejrzysty wynik dla całej partii.
Dane wejściowe
Partia obejmuje cztery poprawne obrazy kodów QR z qr-scans/ oraz piąty plik, scan-05-broken.png, z nieprawidłowymi bajtami.
Skan 1
Skan 2
Skan 3
Skan 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")
Wynik
Konsola wyświetla wiersze dziennika JSON dla każdego pliku: cztery pomyślne odczyty i jeden wpis o błędzie strukturalnym dla uszkodzonego pliku, a następnie podsumowanie partii. IronSoftware.Logger zapisuje wewnętrzne diagnostyki do IronQR-debug.log jednocześnie. Możesz pobrać pełny dziennik debugowania tutaj.
Wyjście JSON bezpośrednio zasila narzędzia do agregacji logów: przekaż stdout do Fluentd, Datadog lub CloudWatch w środowisku konteneryzowanym. Pole ms ujawnia regresje opóźnień, a dziennik debugowania rejestruje wewnętrzne kroki przetwarzania, których nie przechwytuje wrapper.
Więcej informacji
- Poziomy korekcji błędów: dostosuj odporność QR na poziomie kodowania.
- Instrukcja odczytu kodów QR: kompletny przewodnik po procesie odczytu.
- Samouczek dotyczący generatora kodów QR: generowanie z zastosowaniem stylów i logo.
- Dokumentacja API QrReader: sygnatury metod i uwagi.
- Dokumentacja API QrWriter: wszystkie nadładowania metody Write.
Zapoznaj się z opcjami licencyjnymi, gdy będziesz gotowy do produkcji.
Kliknij tutaj, aby pobrać kompletny projekt aplikacji konsolowej DetailedErrorMessagesTest.

