C#でQRコードのエラーメッセージを処理する方法

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

IronQRのエラー処理機能は、読み取りおよび書き込みの失敗を検知し、診断ログを出力し、すべてのスキャンから明確な結果を得るのに役立ちます。 明示的なチェックを追加しない場合、空の結果と破損したファイルの両方とも何も返さないため、何が問題だったのかがわかりません。 的を絞った例外処理と診断ログを追加することで、サイレントエラーを有用なフィードバックに変えることができます。 このガイドでは、空の結果を処理する方法、書き込み時の例外を管理する方法、およびバッチ処理用の構造化ログラッパーを構築する方法について説明します。

クイックスタート: QR コードエラーの処理

QR読み取り操作をtry-catchブロックで包み、ファイルとデコードの失敗の診断情報をログに記録します。

  1. IronQR をNuGetパッケージマネージャでインストール

    PM > Install-Package IronQR
  2. このコード スニペットをコピーして実行します。

    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. 実際の環境でテストするためにデプロイする

    今日プロジェクトで IronQR を使い始めましょう無料トライアル

    arrow pointer

読み取りエラーと空の結果の処理

ログ記録がない場合、呼び出し元にとっては、空の結果と破損したファイルは同じように見える。 以下の例は、ファイルアクセスエラーを検出し、スキャンで結果が返されない場合は警告を発します。

入力

このQRコードの入力例はディスク上に存在します。 ユーザーがファイルを取得してデコードする場合と、ファイルパスが間違っている場合の2つのシナリオをシミュレーションします。

有効な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

出力

QRコードの読み取りが成功したことを示すターミナル出力[QRCode] https://ironsoftware.com/qr/scan-1が表示されます。

ご注意読み取りが成功した場合はQRコード値が返されますが、実行時にエラーが発生した場合は、以下に示す例外メッセージまたは警告が表示されます。

以下のコンソールには、結果が空の場合には [WARN]、ファイルが見つからない場合には [ERROR] が表示され、それぞれについてファイルパスと推奨される対処法が示されています。

ターミナル出力には、damaged-scan.png に QR コードが見つからないという警告と、missing-label.png にファイルが見つからないというエラーが表示されています。

書き込みエラーの処理

nullQrWriter.Write に渡すと、IronQrEncodingException がトリガーされます。 設定されたエラー訂正レベルの容量を超えるデータもエラーになります。これは、訂正レベルが高くなると、利用可能なデータ容量が減少するためです。

入力

以下の2つの入力変数が障害シナリオを定義します:oversizedContentは、最高レベルの訂正能力でもQRコードの容量を超える5,000文字の文字列です。

: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

出力

コンソールには、両方の失敗シナリオにおける例外の種類とメッセージが表示されます。

QrWriter.Write に渡された null コンテンツに対して IronQrEncodingException が発生したことを示すターミナル出力

例外メッセージとともに入力長さを記録し、問題がコンテンツの短縮または修正レベルの引き下げを必要とするかどうかを特定します。 ユーザー入力の場合、例外処理のオーバーヘッドを削減し、診断を改善するために、エンコード前に文字列の長さを検証し、null値をチェックしてください。


QRコード操作のログ記録

内部診断情報を取得するには IronSoftware.Logger を使用してください。 各読み取り操作ごとに、ファイルパス、結果数、経過時間をJSON形式でログに記録するヘルパー関数を実装し、バッチ全体の出力が明確になるようにします。

入力

このバッチには、qr-scans/ からの有効な QR コード画像 4 枚と、無効なバイトを含む 5 番目のファイル scan-05-broken.png が含まれています。

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

出力

コンソールには、各ファイルに関するJSONログ行が表示されます。正常に読み取れた4行と、破損したファイルに関する構造化エラーエントリが1行、そしてバッチの概要が表示されます。 IronSoftware.Logger は、同時に IronQR-debug.log に内部診断情報を書き込みます。完全なデバッグログはこちらからダウンロードできます。

ターミナル出力には、4回の読み取り成功と1回のエラーを示すJSON構造のログ行、Plusバッチ完了の概要が表示されます。

出力されるJSONは、ログ集約ツールに直接取り込まれます。コンテナ化された環境では、stdoutをFluentd、Datadog、またはCloudWatchにパイプで転送します。 ms フィールドはレイテンシの悪化を可視化し、デバッグログはラッパーでは捕捉されない内部処理ステップを記録します。


さらなる読み物

-エラー訂正レベル:エンコードレベルでQRコードの耐性を調整します。

制作準備が整ったら、ライセンスオプションをご確認ください

完全なDetailedErrorMessagesTestコンソールアプリプロジェクトをダウンロードするには、こちらをクリックしてください

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

準備はできましたか?
Nuget ダウンロード 63,625 | バージョン: 2026.4 リリース
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronQR
サンプルを実行する URL が QR コードになるのを見る。