Jak radzić sobie z komunikatami o błędach kodów QR w języku C

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

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 kodów QR należy umieścić w bloku try-catch i rejestrować diagnostykę dotyczącą błędów plików i dekodowania.

  1. Install IronQR with NuGet Package Manager

    PM > Install-Package IronQR
  2. 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}");
    }
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronQR w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer

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.

Prawidłowe kodowanie wejściowe kodu QR 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

Wynik

Wynik wyświetlany w terminalu pokazujący [QR] https://ironsoftware.com/qr/scan-1 po pomyślnym odczytaniu kodu QR

Zwróć uwagęUdany odczyt po prostu zwróciłby wartość kodu QR, a błąd w czasie wykonania pokaże wiadomość wyjątku lub ostrzeżenia pokazane poniżej.

Poniższa konsola pokazuje [WARN] dla przypadku pustego wyniku oraz [ERROR] dla brakującego pliku, wraz ze ścieżką do pliku i sugerowanym działaniem dla każdego z nich.

Wynik terminala pokazujący komunikat WARN o braku kodów QR w pliku damaged-scan.png oraz komunikat ERROR o braku pliku w przypadku missing-label.png

Obsługa błędów zapisu

Przekazanie null do QrWriter.Write powoduje wywołanie 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 awarii: nullContent to null, a oversizedContent to ciąg znaków o długości 5000 znaków, który przekracza pojemność kodu QR przy 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
$vbLabelText   $csharpLabel

Wynik

Konsola wyświetla typ wyjątku i komunikat dla obu scenariuszy awarii.

Wynik terminala pokazujący wyjątek IronQrEncodingException dla treści null przekazanej do QrWriter.Write

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, aby uchwycić wewnętrzną 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 zawiera cztery prawidłowe obrazy kodów QR z qr-scans/ oraz piąty plik, scan-05-broken.png, zawierający nieprawidłowe bajty.

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

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 jednocześnie dane diagnostyczne wewnętrzne do IronQR-debug.log. Pełny dziennik debugowania można pobrać tutaj.

Wynik terminala pokazujący wiersze dziennika w formacie JSON dla 4 pomyślnych odczytów i 1 błędu, a także podsumowanie zakończenia partii

Wynik w formacie JSON jest przekazywany bezpośrednio do narzędzi do agregacji logów: przekaż stdout do Fluentd, Datadog lub CloudWatch w środowisku kontenerowym. Pole ms ujawnia regresje opóźnień, a dziennik debugowania rejestruje wewnętrzne etapy przetwarzania, których nie rejestruje opakowanie.


Więcej informacji

Zapoznaj się z opcjami licencyjnymi, gdy będziesz gotowy do produkcji.

Kliknij tutaj, aby pobrać kompletny projekt aplikacji konsolowej DetailedErrorMessagesTest.

Często Zadawane Pytania

Jak mogę debugować operacje odczytu/zapisu kodów QR w C#?

Można debugować operacje odczytu/zapisu kodów QR w C# za pomocą IronQR, chwytając wyjątki, logując diagnozy i monitorując przetwarzanie wsadowe ze strukturalnym wyjściem.

Co powinienem zrobić, jeśli napotkam błąd podczas przetwarzania kodów QR w C#?

Jeśli napotkasz błąd podczas przetwarzania kodów QR w C#, użyj IronQR do chwytania i obsługi wyjątków. To pozwoli zidentyfikować i rozwiązać problemy skutecznie.

Jak IronQR pomaga w monitorowaniu przetwarzania wsadowego kodów QR?

IronQR pomaga w monitorowaniu przetwarzania wsadowego kodów QR, zapewniając strukturalne wyjście, które pomaga w identyfikacji i rozwiązywaniu błędów lub nieefektywności podczas procesu.

Czy IronQR może logować diagnozy dla operacji kodów QR?

Tak, IronQR może logować diagnozy dla operacji kodów QR, pozwalając śledzić i analizować wydajność oraz błędy w aplikacjach C#.

Jakie są typowe wyjątki w przetwarzaniu kodów QR przy użyciu IronQR?

Typowe wyjątki w przetwarzaniu kodów QR przy użyciu IronQR obejmują problemy związane z nierozczytywalnymi kodami QR i niewłaściwym obsługą formatu, co można zarządzać poprzez właściwą obsługę wyjątków w kodzie C#.

A PHP Error was encountered

Severity: Warning

Message: Illegal string offset 'name'

Filename: sections/author_component.php

Line Number: 18

Backtrace:

File: /var/www/ironpdf.com/application/views/main/sections/author_component.php
Line: 18
Function: _error_handler

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 63
Function: view

File: /var/www/ironpdf.com/application/views/products/sections/three_column_docs_page_structure.php
Line: 64
Function: main_view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/views/products/how-to/index.php
Line: 2
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 552
Function: view

File: /var/www/ironpdf.com/application/controllers/Products/Howto.php
Line: 31
Function: render_products_view

File: /var/www/ironpdf.com/index.php
Line: 292
Function: require_once

k

A PHP Error was encountered

Severity: Warning

Message: Illegal string offset 'title'

Filename: sections/author_component.php

Line Number: 38

Backtrace:

File: /var/www/ironpdf.com/application/views/main/sections/author_component.php
Line: 38
Function: _error_handler

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 63
Function: view

File: /var/www/ironpdf.com/application/views/products/sections/three_column_docs_page_structure.php
Line: 64
Function: main_view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/views/products/how-to/index.php
Line: 2
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 552
Function: view

File: /var/www/ironpdf.com/application/controllers/Products/Howto.php
Line: 31
Function: render_products_view

File: /var/www/ironpdf.com/index.php
Line: 292
Function: require_once

k

A PHP Error was encountered

Severity: Warning

Message: Illegal string offset 'comment'

Filename: sections/author_component.php

Line Number: 48

Backtrace:

File: /var/www/ironpdf.com/application/views/main/sections/author_component.php
Line: 48
Function: _error_handler

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 63
Function: view

File: /var/www/ironpdf.com/application/views/products/sections/three_column_docs_page_structure.php
Line: 64
Function: main_view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/views/products/how-to/index.php
Line: 2
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 552
Function: view

File: /var/www/ironpdf.com/application/controllers/Products/Howto.php
Line: 31
Function: render_products_view

File: /var/www/ironpdf.com/index.php
Line: 292
Function: require_once

k
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 67,270 | Wersja: 2026.5 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronQR
uruchom próbkę obserwuj, jak Twój URL staje się kodem QR.