Como Tratar Erros e Depurar Operações de Código de Barras em C

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

Os fluxos de processamento de códigos de barras podem falhar silenciosamente, com resultados nulos frequentemente interpretados como "nenhum código de barras presente". No entanto, problemas como arquivos corrompidos, PDFs protegidos por senha ou incompatibilidade de formato podem ser os responsáveis. A implementação de um sistema adequado de registro de logs e um tratamento estruturado de erros revela essas falhas e fornece diagnósticos acionáveis.

O IronBarcode oferece uma hierarquia de exceções tipadas no namespace IronBarcode, uma API de registro integrada e propriedades detalhadas de BarcodeResult. Essas propriedades incluem o formato detectado, o valor decodificado, o número da página e as coordenadas para cada decodificação bem-sucedida.

Este guia explica como capturar e interpretar exceções tipadas, extrair contexto de diagnóstico de leituras com falha, habilitar o registro estruturado e isolar falhas durante operações em lote.

Início Rápido: Trate Erros de Código de Barras e Ative Diagnósticos

Envolva chamadas de leitura/gravação em blocos try-catch direcionados às exceções tipadas do IronBarcode para expor mensagens de erro acionáveis em vez de falhas silenciosas.

  1. Instale IronBarcode com o Gerenciador de Pacotes NuGet

    PM > Install-Package BarCode
  2. Copie e execute este trecho de código.

    using IronBarCode;
    using IronBarCode.Exceptions;
    
    try
    {
        BarcodeResults results = BarcodeReader.Read("label.pdf");
        Console.WriteLine($"Found {results.Count} barcode(s)");
    }
    catch (IronBarCodeFileException ex)
    {
        Console.Error.WriteLine($"File error: {ex.Message}");
    }
  3. Implante para testar em seu ambiente de produção.

    Comece a usar IronBarcode em seu projeto hoje com uma avaliação gratuita

    arrow pointer

Como capturar e interpretar exceções do IronBarcode ?

Capturar exceções do IronBarcode , desde as mais específicas até as mais gerais. Ordene os blocos catch para lidar primeiro com exceções acionáveis, como erros de arquivo, senha de PDF e codificação, seguidos pelo tipo base. O namespace .Exceptions do IronBarcode define 11 tipos de exceção, cada um correspondendo a um modo de falha específico:

Tipos de Exceções do IronBarcode — Causas e Correções Recomendadas
Tipo de ExceçãoGatilhoCorreção recomendada
IronBarCodeFileExceptionO arquivo está corrompido, bloqueado ou em um formato de imagem não compatível.Verifique se o arquivo está em um formato de imagem compatível e se não está bloqueado; além disso, trate a exceção FileNotFoundException separadamente para arquivos ausentes.
IronBarCodePdfPasswordExceptionPDF está protegido por senha ou criptografadoForneça a senha via PdfBarcodeReaderOptions ou pule o arquivo e registre o erro
IronBarCodeEncodingExceptionFalha genérica de codificação durante a geração de código de barrasVerifique se os dados de entrada correspondem às restrições do BarcodeWriterEncoding alvo
IronBarCodeContentTooLongEncodingExceptionValor excede o limite de caracteres para a simbologia selecionadaTrunque os dados ou mude para um formato de maior capacidade (QR, DataMatrix)
IronBarCodeFormatOnlyAcceptsNumericValuesEncodingExceptionCaracteres não numéricos passados para um formato apenas numérico (EAN, UPC)Higienize a entrada ou mude para um formato alfanumérico (Code128, Code39)
IronBarCodeUnsupportedRendererEncodingExceptionO BarcodeEncoding selecionado não é gravável pelo IronBarcodeUse a enumeração BarcodeWriterEncoding em vez de BarcodeEncoding
IronBarCodeParsingExceptionDados estruturados (GS1-128) falham na validação durante a análiseValide a estrutura GS1 com Code128GS1Parser.IsValid() antes de analisar
IronBarCodeNativeExceptionErro na camada de interoperabilidade nativa (DLLs ausentes, incompatibilidade de plataforma)Verifique se os pacotes NuGet específicos da plataforma estão instalados (BarCode.Linux, BarCode.macOS)
IronBarCodeConfidenceThresholdExceptionArgumento de limiar de confiança inválido passado para as opções de leituraGaranta que ConfidenceThreshold esteja entre 0,0 e 1,0
IronBarCodeUnsupportedExceptionOperação não suportada no contexto atualVerifique o changelog para disponibilidade de recursos na sua versão
IronBarCodeExceptionTipo base — captura qualquer erro específico do IronBarcode não correspondido acimaRegistre detalhes completos da exceção e escale para investigação

Use filtros de exceção com cláusulas when para rotear tipos de exceção sobrepostos sem aninhamento profundo. Arquivos ausentes geram o erro padrão System.IO.FileNotFoundException em vez de IronBarCodeFileException, portanto, inclua um bloco catch separado para esse caso:

Entrada

Um código de barras Code128 que codifica um número de fatura (caminho de sucesso) e um código de barras de etiqueta de armazém que representa o conteúdo do PDF ausente (caminho de falha).

O código de barras Code128, INV-2024-7829, foi usado como entrada da fatura digitalizada.
Code128 barcode representing the content of the missing warehouse-labels.pdf failure path input
:path=/static-assets/barcode/content-code-examples/how-to/detailed-error-messages/exception-hierarchy.cs
using IronBarCode;
using IronBarCode.Exceptions;

// Success path: valid file present on disk
string filePath = "scanned-invoice.png";
// Failure path: file does not exist → caught by FileNotFoundException below
// string filePath = "warehouse-labels.pdf";

try
{
    BarcodeResults results = BarcodeReader.Read(filePath);
    foreach (BarcodeResult result in results)
    {
        // Print the detected symbology and decoded value for each barcode found
        Console.WriteLine($"[{result.BarcodeType}] {result.Value}");
    }
}
catch (IronBarCodePdfPasswordException ex)
{
    // PDF is encrypted — supply the password via PdfBarcodeReaderOptions before retrying
    Console.Error.WriteLine($"PDF requires password: {filePath} — {ex.Message}");
}
catch (IronBarCodeFileException ex)
{
    // File is present but corrupted, locked, or in an unsupported format
    Console.Error.WriteLine($"Cannot read file: {filePath} — {ex.Message}");
}
catch (FileNotFoundException ex)
{
    // Missing files throw FileNotFoundException, not IronBarCodeFileException
    Console.Error.WriteLine($"File not found: {filePath} — {ex.Message}");
}
catch (IronBarCodeNativeException ex) when (ex.Message.Contains("DLL"))
{
    // The when filter routes only missing-DLL errors here; other native exceptions
    // fall through to the IronBarCodeException block below
    Console.Error.WriteLine($"Missing native dependency: {ex.Message}");
}
catch (IronBarCodeException ex)
{
    // Base catch for any IronBarcode-specific error not matched by the blocks above
    Console.Error.WriteLine($"IronBarcode error: {ex.GetType().Name} — {ex.Message}");
}
$vbLabelText   $csharpLabel

Saída

ObserveUm arquivo válido corresponde ao tipo e valor do código de barras decodificado.

Saída do console mostrando decodificação bem-sucedida do Code128: [Code128] INV-2024-7829

A ausência de um arquivo aciona o código FileNotFoundException, encaminhado pelo bloco catch dedicado.

Saída do console mostrando FileNotFoundException para o arquivo warehouse-labels.pdf ausente.

O filtro when (ex.Message.Contains("DLL")) em IronBarCodeNativeException direciona erros de dependência ausente para um manipulador específico sem afetar outras exceções nativas. Essa abordagem é especialmente útil em implantações do Docker, onde podem faltar pacotes específicos da plataforma.

O código IronSoftware.Exceptions.LicensingException é lançado separadamente quando a chave de licença é inválida ou está ausente. Capture essa exceção na inicialização do aplicativo, em vez de em torno de chamadas individuais de leitura ou gravação.


Como extrair detalhes de diagnóstico de leituras com falha?

Uma operação de leitura que retorna zero resultados não é uma exceção; produz uma coleção vazia BarcodeResults. O contexto de diagnóstico é obtido através da inspeção dos parâmetros de entrada, das opções configuradas e de quaisquer resultados parciais retornados.

O objeto BarcodeResult fornece propriedades úteis para análise post-mortem, incluindo BarcodeType, Value, PageNumber e Points (coordenadas dos cantos). Se os resultados estiverem presentes, mas forem inesperados, primeiro verifique BarcodeType em relação ao formato esperado e verifique o PageNumber.

Entrada

Um código de barras Code128 que codifica um número de fatura, lido com ExpectBarcodeTypes definido para Code128 e QRCode, e ReadingSpeed.Detailed para uma leitura completa.

O código de barras Code128, INV-2024-7829, foi usado como entrada da fatura digitalizada.
:path=/static-assets/barcode/content-code-examples/how-to/detailed-error-messages/diagnostic-logging.cs
using IronBarCode;

string filePath = "scanned-invoice.png";

// Configure the reader to narrow the search to specific symbologies and use
// a thorough scan pass — narrows false positives and improves decode accuracy
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode, // limit scan to known formats
    Speed = ReadingSpeed.Detailed,      // slower but more thorough — use ExtremeDetail for damaged images
    ExpectMultipleBarcodes = true       // scan the full image rather than stopping at the first match
};

BarcodeResults results = BarcodeReader.Read(filePath, options);

// An empty result is not an exception — it means no barcode matched the configured options
if (results == null || results.Count == 0)
{
    // Log the configured options alongside the warning so the cause is immediately actionable
    Console.Error.WriteLine($"[WARN] No barcodes found in: {filePath}");
    Console.Error.WriteLine($"  ExpectedTypes: {options.ExpectBarcodeTypes}");
    Console.Error.WriteLine($"  Speed: {options.Speed}");
    Console.Error.WriteLine($"  Action: Retry with ReadingSpeed.ExtremeDetail or broaden ExpectBarcodeTypes");
}
else
{
    foreach (BarcodeResult result in results)
    {
        // Points contains the four corner coordinates of the barcode in the image;
        // use the first corner as a representative position indicator
        string pos = result.Points.Length > 0 ? $"{result.Points[0].X:F0},{result.Points[0].Y:F0}" : "N/A";
        Console.WriteLine($"[{result.BarcodeType}] {result.Value} "
            + $"(Page: {result.PageNumber}, Position: {pos})");
    }
}
$vbLabelText   $csharpLabel

Saída

Quando o código de barras ExpectBarcodeTypes corresponde ao código de barras na imagem, a leitura retorna o tipo, o valor, o número da página e a posição.

Saída do console mostrando decodificação bem-sucedida do Code128 com número da página e coordenadas de posição.

Se ExpectBarcodeTypes não incluir a simbologia real, a leitura retornará um resultado vazio. O bloco [WARN] registra os tipos configurados, a velocidade de leitura e uma próxima ação sugerida.

Saída do console mostrando [AVISO] nenhum código de barras encontrado com ExpectBarcodeTypes definido como Code39 para uma imagem Code128

Durante o diagnóstico, dois padrões comuns emergem. Resultados vazios com uma configuração estreita ExpectBarcodeTypes geralmente significam que o código de barras usa uma simbologia diferente; expandindo para BarcodeEncoding.All posso confirmar isso. Resultados de decodificação inesperados geralmente indicam baixa qualidade de imagem.

Aplicar filtros de imagem e tentar novamente com uma velocidade de leitura mais lenta geralmente resolve esses problemas. Você também pode ativar/desativar a opção RemoveFalsePositive para eliminar leituras fantasmas provenientes de ruídos de fundo.

Como faço para ativar o registro detalhado de operações com código de barras?

IronBarcode expõe uma API de registro integrada através de IronSoftware.Logger. Configure o modo de registro e o caminho do arquivo antes de qualquer operação com código de barras para capturar a saída de diagnóstico interna dos pipelines de leitura e gravação.

Entrada

Uma imagem TIFF de código de barras Code128 usada como alvo de leitura enquanto o registro detalhado está ativo.

O código de barras Code128 PROB-SCAN-999 foi usado como entrada de leitura do problema para o exemplo de registro.
:path=/static-assets/barcode/content-code-examples/how-to/detailed-error-messages/enable-logging.cs
using IronBarCode;

// Enable IronBarcode's built-in logging — set BEFORE any read/write calls
// LoggingModes.All writes both debug output and file-level diagnostics
IronSoftware.Logger.LoggingMode = IronSoftware.Logger.LoggingModes.All;
IronSoftware.Logger.LogFilePath = "ironbarcode-debug.log"; // path is relative to the working directory

// All subsequent operations will write internal processing steps to the log file:
// image pre-processing stages, format detection attempts, and native interop calls
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Detailed,
    ExpectBarcodeTypes = BarcodeEncoding.All  // scan for every supported symbology
};

BarcodeResults results = BarcodeReader.Read("problem-scan.tiff", options);
Console.WriteLine($"Read complete. Results: {results.Count}. See ironbarcode-debug.log for details.");
$vbLabelText   $csharpLabel

LoggingModes.All captura tanto a saída de depuração quanto o registro em nível de arquivo. O arquivo de log registra etapas de processamento interno, como estágios de pré-processamento de imagem, tentativas de detecção de formato e chamadas de interoperabilidade nativas, que não são visíveis por meio da API pública.

Para pipelines de produção que utilizam um framework de registro estruturado (Serilog, NLog, Microsoft.Extensions.Logging), o encapsulamento das operações do IronBarcode em uma camada de middleware adiciona entradas JSON estruturadas juntamente com o arquivo de log integrado. O logger integrado grava diagnósticos em texto simples, úteis para escalonamento de suporte; O wrapper estruturado fornece campos consultáveis ​​para a pilha de observabilidade.

:path=/static-assets/barcode/content-code-examples/how-to/detailed-error-messages/structured-wrapper.cs
using IronBarCode;
using System.Diagnostics;

// Lightweight wrapper that adds structured JSON observability to every read call.
// Call this in place of BarcodeReader.Read wherever elapsed-time and status logging is needed.
BarcodeResults ReadWithDiagnostics(string filePath, BarcodeReaderOptions options)
{
    var sw = Stopwatch.StartNew(); // start timing before the read so setup overhead is included
    try
    {
        BarcodeResults results = BarcodeReader.Read(filePath, options);
        sw.Stop();
        // Emit a structured success entry to stdout — pipe to Fluentd, Datadog, or CloudWatch
        Console.WriteLine($"{{\"file\":\"{filePath}\",\"status\":\"ok\","
            + $"\"count\":{results.Count},\"elapsed_ms\":{sw.ElapsedMilliseconds}}}");
        return results;
    }
    catch (Exception ex)
    {
        sw.Stop();
        // Emit a structured error entry to stderr with exception type, message, and elapsed time
        Console.Error.WriteLine($"{{\"file\":\"{filePath}\",\"status\":\"error\","
            + $"\"exception\":\"{ex.GetType().Name}\",\"message\":\"{ex.Message}\","
            + $"\"elapsed_ms\":{sw.ElapsedMilliseconds}}}");
        throw; // rethrow so the caller's catch blocks still handle the exception normally
    }
}
$vbLabelText   $csharpLabel

A saída estruturada integra-se diretamente com ferramentas de agregação de logs. Encaminhe stdout para Fluentd, Datadog ou CloudWatch em uma implantação conteinerizada. O campo de tempo decorrido destaca as regressões de desempenho antes que elas se tornem violações do SLA.

Saída

Saída do console mostrando uma leitura bem-sucedida do código de barras com registro detalhado ativado e o caminho do arquivo de log.

Como depurar o processamento em lote de códigos de barras?

Processar vários arquivos isolando cada leitura em seu próprio bloco try-catch, registrando os resultados para cada arquivo e gerando um resumo agregado. O processo continua mesmo após falhas, em vez de parar no primeiro erro.

Entrada

Quatro das cinco imagens de código de barras Code128 do diretório de lotes scans/. O quinto arquivo (scan-05-broken.png) contém bytes inválidos que podem causar uma exceção de arquivo.

Code128 barcode encoding ITEM-SQ-001

Lote 1 — Digitalização 1

Code128 barcode encoding ITEM-SQ-002

Lote 1 — Digitalização 2

Code128 barcode encoding ITEM-SQ-003

Lote 1 — Digitalização 3

Code128 barcode encoding ITEM-SQ-004

Lote 1 — Digitalização 4

:path=/static-assets/barcode/content-code-examples/how-to/detailed-error-messages/batch-processing.cs
using IronBarCode;
using IronBarCode.Exceptions;
using System.Diagnostics;

// Enable built-in logging for the entire batch run so internal processing steps
// are captured in the log file alongside the per-file console output
IronSoftware.Logger.LoggingMode = IronSoftware.Logger.LoggingModes.All;
IronSoftware.Logger.LogFilePath = "batch-run.log";

// Collect all files in the directory — SearchOption.TopDirectoryOnly skips subdirectories
string[] files = Directory.GetFiles("scans/", "*.*", SearchOption.TopDirectoryOnly);

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,                                    // balances throughput vs accuracy
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode, // limit to known formats
    ExpectMultipleBarcodes = true                                     // scan each file fully
};

// Three outcome counters: success (decoded), empty (read OK but no barcode found), fail (exception)
int successCount = 0;
int failCount = 0;
int emptyCount = 0;
var errors = new List<(string File, string Error)>(); // per-file error context for root cause analysis
var sw = Stopwatch.StartNew();

foreach (string file in files)
{
    try
    {
        BarcodeResults results = BarcodeReader.Read(file, options);

        // Empty result is not an exception — the file was read but contained no matching barcode
        if (results == null || results.Count == 0)
        {
            emptyCount++;
            errors.Add((file, "No barcodes detected")); // record so caller can adjust options
            continue;
        }

        foreach (BarcodeResult result in results)
        {
            Console.WriteLine($"{Path.GetFileName(file)} | {result.BarcodeType} | {result.Value}");
        }
        successCount++;
    }
    catch (IronBarCodePdfPasswordException)
    {
        // PDF is password-protected — supply password via PdfBarcodeReaderOptions to recover
        failCount++;
        errors.Add((file, "Password-protected PDF"));
    }
    catch (IronBarCodeFileException ex)
    {
        // File is corrupted, locked, or in an unsupported image format
        failCount++;
        errors.Add((file, $"File error: {ex.Message}"));
    }
    catch (FileNotFoundException ex)
    {
        // File was in the directory listing but deleted before the read completed (race condition)
        failCount++;
        errors.Add((file, $"File not found: {ex.Message}"));
    }
    catch (IronBarCodeException ex)
    {
        // Catch-all for any other IronBarcode-specific errors not handled above
        failCount++;
        errors.Add((file, $"{ex.GetType().Name}: {ex.Message}"));
    }
    catch (Exception ex)
    {
        // Unexpected non-IronBarcode error — log the full type for investigation
        failCount++;
        errors.Add((file, $"Unexpected: {ex.GetType().Name}: {ex.Message}"));
    }
}

sw.Stop();

// Summary report — parse failCount > 0 in CI/CD to set a non-zero exit code
Console.WriteLine("\n--- Batch Summary ---");
Console.WriteLine($"Total files:    {files.Length}");
Console.WriteLine($"Success:        {successCount}");
Console.WriteLine($"Empty reads:    {emptyCount}");
Console.WriteLine($"Failures:       {failCount}");
Console.WriteLine($"Elapsed:        {sw.Elapsed.TotalSeconds:F1}s");

if (errors.Any())
{
    Console.WriteLine("\n--- Error Details ---");
    foreach (var (errorFile, errorMsg) in errors)
    {
        Console.Error.WriteLine($"  {Path.GetFileName(errorFile)}: {errorMsg}");
    }
}
$vbLabelText   $csharpLabel

Saída

Saída do console mostrando o resumo do lote: 4 sucessos, 1 falha, com detalhes do erro para o arquivo corrompido.

Durante a execução, o console exibe uma linha para cada código de barras decodificado, seguida de um resumo com a contagem de arquivos, sucessos, leituras vazias, falhas e tempo decorrido. Os erros são listados com seus respectivos nomes de arquivo e motivos da falha.

O processo distingue três categorias de resultado: sucesso (códigos de barras encontrados e decodificados), vazio (arquivo lido, mas nenhum código de barras detectado) e falha (exceção lançada). Essa distinção é importante porque leituras vazias e falhas exigem respostas diferentes. Leituras vazias podem exigir configurações de formato mais abrangentes, enquanto falhas geralmente indicam problemas de infraestrutura, como arquivos ausentes, recursos bloqueados ou dependências nativas ausentes.

A lista de erros mantém o contexto de cada arquivo para auxiliar na análise da causa raiz. Em um pipeline de CI/CD, analise essa saída para definir códigos de saída (zero para sucesso completo e diferente de zero quando failCount for maior que zero) ou encaminhe os detalhes do erro para um sistema de alertas.

Para obter maior desempenho, habilite o processamento paralelo definindo Multithreaded para true e ajustando MaxParallelThreads para corresponder aos núcleos de CPU disponíveis. Mantenha o isolamento por arquivo envolvendo a iteração paralela em Parallel.ForEach e usando uma coleção thread-safe para a lista de erros.


Leitura complementar

Veja as opções de licenciamento quando o pipeline estiver pronto para produção.

Perguntas frequentes

Como posso lidar com erros em operações de código de barras usando IronBarcode?

IronBarcode fornece exceções tipadas e registro interno para gerenciar e lidar eficazmente com erros nas operações de código de barras, garantindo que sua aplicação funcione sem problemas.

Quais recursos o IronBarcode oferece para depurar problemas de código de barras?

IronBarcode inclui extração de diagnóstico e isolamento de erros em lote pronto para produção, que ajudam os desenvolvedores a identificar e resolver problemas relacionados a códigos de barras de forma eficiente.

O IronBarcode pode registrar erros durante o processamento de códigos de barras?

Sim, o IronBarcode possui recursos de registro interno que permitem aos desenvolvedores capturar e registrar detalhes de erros durante o processamento de códigos de barras, facilitando a depuração.

O que são exceções tipadas no IronBarcode?

Exceções tipadas no IronBarcode são tipos de erro específicos que fornecem informações detalhadas sobre questões de operações envolvendo códigos de barras, tornando mais fácil para os desenvolvedores diagnosticar e corrigir problemas.

Como o IronBarcode auxilia no isolamento de erros em lote?

IronBarcode oferece isolamento de erros em lote pronto para produção, o que ajuda a separar operações de código de barras com erro das bem-sucedidas, simplificando a gestão de erros no processamento em lote.

Existe uma maneira de extrair diagnósticos de operações de código de barras usando IronBarcode?

Sim, o IronBarcode fornece ferramentas de extração de diagnóstico que ajudam os desenvolvedores a reunir informações detalhadas sobre operações de código de barras, auxiliando na solução de problemas e na resolução de erros.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais
Pronto para começar?
Nuget Downloads 2,121,847 | Versão: 2026.3 acaba de ser lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package BarCode
executar um exemplo Veja seu fio se transformar em um código de barras.