# 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.
*as-heading:2(Szybki start: Obsługa błędów kodów QR)*
Owijaj operacje odczytu QR w bloku `try-catch` i rejestruj diagnostykę dla awarii plików i dekodowania.
```csharp
:title=Quickstart
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}");
}
```
<div class="hsg-featured-snippet">
<h3>Minimalny proces (5 kroków)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/IronQR/">Pobierz bibliotekę IronQR C# do obsługi błędów kodów QR</a></li>
<li>Otocz wywołania odczytu/zapisu QR w blokach <code>try-catch</code></li>
<li>Przechwytuj <code>wyjątki IOException</code> i <code>ArgumentException</code> dla konkretnych błędów</li>
<li>Rejestruj diagnostykę pustych wyników i wyjątków</li>
<li>Użyj strukturalnego logowania JSON do obserwowalności potoku</li>
</ol>
</div>
## 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.
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/qr/how-to/detailed-error-messages/input-scan-one.webp"
alt="Prawidłowe kodowanie wejściowe kodu QR https://ironsoftware.com/qr/scan-1"
class="img-responsive add-shadow" />
</div>
</div>
```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}");
}
```
### Wynik
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/qr/how-to/detailed-error-messages/success-output-qr.webp" alt="Wynik wyświetlany w terminalu pokazujący [QR] https://ironsoftware.com/qr/scan-1 po pomyślnym odczytaniu kodu QR" class="img-responsive add-shadow" />
</div>
</div>
[[i:(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.)]]
Niżej znajdująca się konsola pokazuje `[WARN]` dla przypadku pustego wyniku i `[ERROR]` dla braku pliku, z ścieżką pliku i sugerowanym działaniem dla każdego przypadku.
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/qr/how-to/detailed-error-messages/output-read-diagnostics.webp" alt="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" class="img-responsive add-shadow" />
</div>
</div>
---
## 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](https://ironsoftware.com/csharp/qr/how-to/error-correction-qr-code/), również powodują błąd, ponieważ wyższe poziomy korekcji zmniejszają dostępną pojemność danych.
### Dane wejściowe
Poniższe dwie zmienne wejściowe definiują scenariusze awarii: `nullContent` to `null` i `oversizedContent` to 5 000-znakowy ciąg, który przekracza pojemność QR przy najwyższym poziomie korekcji.
```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");
}
```
### Wynik
Konsola wyświetla typ wyjątku i komunikat dla obu scenariuszy awarii.
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/qr/how-to/detailed-error-messages/output-write-diagnostics.webp" alt="Wynik terminala pokazujący wyjątek IronQrEncodingException dla treści null przekazanej do QrWriter.Write" class="img-responsive add-shadow" />
</div>
</div>
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 zarejestrować 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`, z nieprawidłowymi bajtami.
<div class="competitors-section__wrapper-even-1">
<div class="competitors__card" style="width: 22.5%;">
<img src="/static-assets/qr/how-to/detailed-error-messages/input-scan-one.webp"
alt="Kod QR kodujący https://ironsoftware.com/qr/scan-1"
class="img-responsive add-shadow" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Skan 1
</p>
</div>
<div class="competitors__card" style="width: 22.5%;">
<img src="/static-assets/qr/how-to/detailed-error-messages/input-scan-two.webp"
alt="Kod QR kodujący https://ironsoftware.com/qr/scan-2"
class="img-responsive add-shadow" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Skan 2
</p>
</div>
<div class="competitors__card" style="width: 22.5%;">
<img src="/static-assets/qr/how-to/detailed-error-messages/input-scan-three.webp"
alt="Kod QR kodujący https://ironsoftware.com/qr/scan-3"
class="img-responsive add-shadow" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Skan 3
</p>
</div>
<div class="competitors__card" style="width: 22.5%;">
<img src="/static-assets/qr/how-to/detailed-error-messages/input-scan-four.webp"
alt="Kod QR kodujący https://ironsoftware.com/qr/scan-4"
class="img-responsive add-shadow" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Skan 4
</p>
</div>
</div>
```cs
using IronQr;
using IronSoftware.Drawing;
using System.Diagnostics;
// Enable shared Iron Software logging for internal diagnostics
IronQr.Logging.Logger.LoggingMode = IronQr.Logging.Logger.LoggingModes.All;
IronQr.Logging.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");
```
### 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ętrzną diagnostykę do `IronQR-debug.log` w tym samym czasie. Możesz pobrać pełny dziennik debugowania [tutaj](/static-assets/qr/how-to/detailed-error-messages/ironqr-debug.log).
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/qr/how-to/detailed-error-messages/output-logging-wrapper.webp" alt="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" class="img-responsive add-shadow" />
</div>
</div>
Wyjście JSON jest bezpośrednio przesyłane do narzędzi agregacji dzienników: przekieruj `stdout` do Fluentd, Datadog lub CloudWatch w zcontainerizowanej wdrożeniu. Pole `ms` ujawnia regresję opóźnieniową, a dziennik debugowania rejestruje wewnętrzne kroki przetwarzania, których opakowanie nie obejmuje.
---
## Więcej informacji
- [Poziomy korekcji błędów](https://ironsoftware.com/csharp/qr/how-to/error-correction-qr-code/): dostosuj odporność QR na poziomie kodowania.
- [Instrukcja odczytu kodów QR](https://ironsoftware.com/csharp/qr/how-to/read-qr-codes-from-image/): kompletny przewodnik po procesie odczytu.
- [Samouczek dotyczący generatora kodów QR](https://ironsoftware.com/csharp/qr/tutorials/csharp-qr-code-generator/): generowanie z zastosowaniem stylów i logo.
- [Dokumentacja API QrReader](https://ironsoftware.com/csharp/qr/object-reference/api/IronQr.QrReader.html): sygnatury metod i uwagi.
- [Dokumentacja API QrWriter](https://ironsoftware.com/csharp/qr/object-reference/api/IronQr.QrWriter.html): wszystkie przeciążenia `Write`.
[Zapoznaj się z opcjami licencyjnymi,](https://ironsoftware.com/csharp/qr/licensing/) gdy będziesz gotowy do produkcji.
[Kliknij tutaj, aby pobrać](/static-assets/qr/how-to/detailed-error-messages/DetailedErrorMessagesTest.zip) kompletny projekt aplikacji konsolowej DetailedErrorMessagesTest.
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
Owijaj operacje odczytu QR w bloku try-catch i rejestruj diagnostykę dla awarii plików i dekodowania.
1Install IronQR with NuGet Package Manager
PM > Install-Package IronQR
Install-Package IronQR
2Skopiuj 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}");}
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}");
}
C#
3Wdrożenie do testowania w środowisku produkcyjnym
Otocz wywołania odczytu/zapisu QR w blokach try-catch
Przechwytuj wyjątki IOException i ArgumentException dla 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.
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 loggingConsole.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}");}
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}");
}
ImportsIronQrImportsIronSoftware.DrawingModuleModule1 Sub Main() Dim filePath AsString = "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 AsIEnumerable(OfQrResult) = reader.Read(imageInput) IfNot results.Any() Then ' Not an exception — but a diagnostic event worth loggingConsole.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 AsQrResultIn resultsConsole.WriteLine($"[{result.QrType}] {result.Value}") Next End IfCatch ex AsFileNotFoundExceptionConsole.Error.WriteLine($"[ERROR] File not found: {filePath}")Catch ex AsIOExceptionConsole.Error.WriteLine($"[ERROR] Cannot read file: {filePath} — {ex.Message}")Catch ex AsExceptionConsole.Error.WriteLine($"[ERROR] Unexpected failure reading {filePath}: {ex.GetType().Name} — {ex.Message}")EndTry End SubEndModule
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
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.
Niżej znajdująca się konsola pokazuje [WARN] dla przypadku pustego wyniku i [ERROR] dla braku pliku, z ścieżką pliku i 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
Poniższe dwie zmienne wejściowe definiują scenariusze awarii: nullContent to null i oversizedContent to 5 000-znakowy ciąg, który przekracza pojemność QR przy najwyższym poziomie korekcji.
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 inputtry{ 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 leveltry{ 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}"); // OutputConsole.Error.WriteLine($" Input length: {oversizedContent.Length} chars");Console.Error.WriteLine($" Action: Reduce content or lower error correction level");}
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");
}
ImportsIronQrDim content AsString = Nothing ' Nothing throws IronQrEncodingException Dim oversizedContent AsString = New String("A"c, 5000) ' 5,000 chars exceeds QR capacity at Highest error correction level ' Scenario 1: null inputTry Dim qr AsQrCode = QrWriter.Write(content) ' InputCatch ex AsExceptionConsole.Error.WriteLine($"[ERROR] Null content: {ex.GetType().Name} — {ex.Message}") ' OutputEndTry' Scenario 2: data exceeds QR capacity at the configured error correction levelTry Dim options As New QrOptions(QrErrorCorrectionLevel.Highest) Dim qr AsQrCode = QrWriter.Write(oversizedContent, options) ' InputCatch ex AsExceptionConsole.Error.WriteLine($"[ERROR] QR capacity exceeded: {ex.Message}") ' OutputConsole.Error.WriteLine($" Input length: {oversizedContent.Length} chars")Console.Error.WriteLine(" Action: Reduce content or lower error correction level")EndTry
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, aby zarejestrować 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, z nieprawidłowymi bajtami.
Skan 1
Skan 2
Skan 3
Skan 4
using IronQr;using IronSoftware.Drawing;using System.Diagnostics;// Enable shared Iron Software logging for internal diagnosticsIronQr.Logging.Logger.LoggingMode = IronQr.Logging.Logger.LoggingModes.All;IronQr.Logging.Logger.LogFilePath = "ironqr-debug.log";// Reusable wrapper for structured observability(IEnumerable<QrResult> Results, boolSuccess, stringError) 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 isolationstring[] 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");
using IronQr;
using IronSoftware.Drawing;
using System.Diagnostics;
// Enable shared Iron Software logging for internal diagnostics
IronQr.Logging.Logger.LoggingMode = IronQr.Logging.Logger.LoggingModes.All;
IronQr.Logging.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");
C#
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ętrzną diagnostykę do IronQR-debug.log w tym samym czasie. Możesz pobrać pełny dziennik debugowania tutaj.
Wyjście JSON jest bezpośrednio przesyłane do narzędzi agregacji dzienników: przekieruj stdout do Fluentd, Datadog lub CloudWatch w zcontainerizowanej wdrożeniu. Pole ms ujawnia regresję opóźnieniową, a dziennik debugowania rejestruje wewnętrzne kroki przetwarzania, których opakowanie nie obejmuje.
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#.
How can I improve error detection during QR code processing with IronQR?
Improve error detection by implementing logging that captures detailed information on file paths, operation status, result counts, and execution time. This data supports easier debugging and system observability.
Can IronQR's logging output be integrated with log aggregation tools?
Yes, the JSON output from IronQR can be fed directly into log aggregation tools such as Fluentd, Datadog, or CloudWatch, making it suitable for containerized deployments and enhancing monitoring capabilities.
What approach does IronQR suggest for handling batch QR code operations?
IronQR recommends processing each file in isolation, logging the results for each read operation to help identify errors, and providing a complete batch summary that tallies successes and failures.
How does IronQR assist in diagnosing file-level failures during QR code scans?
IronQR detects file-level failures like IOException and FileNotFoundException, providing descriptive error messages which can be logged to pinpoint issues such as incorrect file paths or unreadable files.
Why is it important to wrap QR read/write calls in try-catch blocks?
Wrapping read/write operations in try-catch blocks ensures that failures do not crash the application, allowing you to handle exceptions gracefully, log necessary diagnostics, and guide the user with useful messages.
Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.