Como Tratar Erros e Depurar Operações de Código de Barras em C
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.
-
Instale IronBarcode com o Gerenciador de Pacotes NuGet
PM > Install-Package BarCode -
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}"); } -
Implante para testar em seu ambiente de produção.
Comece a usar IronBarcode em seu projeto hoje com uma avaliação gratuita
Como lidar com erros de código de barras e ativar o diagnóstico com o IronBarcode
- Baixe a biblioteca IronBarcode do NuGet
- Envolva chamadas de leitura/gravação em blocos try-catch direcionados a tipos específicos de exceção
- Inspecione
BarcodeResultspara entradas vazias ou de baixa confiança após uma leitura bem-sucedida - Habilite
IronSoftware.Loggerpara capturar a saída de diagnósticos internos - Isole falhas por arquivo em operações em lote com lógica de continuação em caso de erro
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:
| Tipo de Exceção | Gatilho | Correção recomendada |
|---|---|---|
IronBarCodeFileException | O 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. |
IronBarCodePdfPasswordException | PDF está protegido por senha ou criptografado | Forneça a senha via PdfBarcodeReaderOptions ou pule o arquivo e registre o erro |
IronBarCodeEncodingException | Falha genérica de codificação durante a geração de código de barras | Verifique se os dados de entrada correspondem às restrições do BarcodeWriterEncoding alvo |
IronBarCodeContentTooLongEncodingException | Valor excede o limite de caracteres para a simbologia selecionada | Trunque os dados ou mude para um formato de maior capacidade (QR, DataMatrix) |
IronBarCodeFormatOnlyAcceptsNumericValuesEncodingException | Caracteres 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) |
IronBarCodeUnsupportedRendererEncodingException | O BarcodeEncoding selecionado não é gravável pelo IronBarcode | Use a enumeração BarcodeWriterEncoding em vez de BarcodeEncoding |
IronBarCodeParsingException | Dados estruturados (GS1-128) falham na validação durante a análise | Valide a estrutura GS1 com Code128GS1Parser.IsValid() antes de analisar |
IronBarCodeNativeException | Erro 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) |
IronBarCodeConfidenceThresholdException | Argumento de limiar de confiança inválido passado para as opções de leitura | Garanta que ConfidenceThreshold esteja entre 0,0 e 1,0 |
IronBarCodeUnsupportedException | Operação não suportada no contexto atual | Verifique o changelog para disponibilidade de recursos na sua versão |
IronBarCodeException | Tipo base — captura qualquer erro específico do IronBarcode não correspondido acima | Registre 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).
Fatura digitalizada.png (caminho de sucesso)
warehouse-labels.pdf (caminho de falha — arquivo não presente no disco)
: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}");
}
Imports IronBarCode
Imports IronBarCode.Exceptions
' Success path: valid file present on disk
Dim filePath As String = "scanned-invoice.png"
' Failure path: file does not exist → caught by FileNotFoundException below
' Dim filePath As String = "warehouse-labels.pdf"
Try
Dim results As BarcodeResults = BarcodeReader.Read(filePath)
For Each result As BarcodeResult In results
' Print the detected symbology and decoded value for each barcode found
Console.WriteLine($"[{result.BarcodeType}] {result.Value}")
Next
Catch ex As IronBarCodePdfPasswordException
' PDF is encrypted — supply the password via PdfBarcodeReaderOptions before retrying
Console.Error.WriteLine($"PDF requires password: {filePath} — {ex.Message}")
Catch ex As IronBarCodeFileException
' File is present but corrupted, locked, or in an unsupported format
Console.Error.WriteLine($"Cannot read file: {filePath} — {ex.Message}")
Catch ex As FileNotFoundException
' Missing files throw FileNotFoundException, not IronBarCodeFileException
Console.Error.WriteLine($"File not found: {filePath} — {ex.Message}")
Catch ex As IronBarCodeNativeException 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 ex As IronBarCodeException
' Base catch for any IronBarcode-specific error not matched by the blocks above
Console.Error.WriteLine($"IronBarcode error: {ex.GetType().Name} — {ex.Message}")
End Try
Saída
A ausência de um arquivo aciona o erro FileNotFoundException, encaminhado pelo bloco catch dedicado.
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.
: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})");
}
}
Imports IronBarCode
Dim filePath As String = "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
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.Code128 Or 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
}
Dim results As BarcodeResults = BarcodeReader.Read(filePath, options)
' An empty result is not an exception — it means no barcode matched the configured options
If results Is Nothing OrElse results.Count = 0 Then
' 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
For Each result As BarcodeResult In results
' Points contains the four corner coordinates of the barcode in the image;
' use the first corner as a representative position indicator
Dim pos As String = If(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})")
Next
End If
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.
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.
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.
: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.");
Imports 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
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Detailed,
.ExpectBarcodeTypes = BarcodeEncoding.All ' scan for every supported symbology
}
Dim results As BarcodeResults = BarcodeReader.Read("problem-scan.tiff", options)
Console.WriteLine($"Read complete. Results: {results.Count}. See ironbarcode-debug.log for details.")
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
}
}
Imports IronBarCode
Imports 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.
Function ReadWithDiagnostics(filePath As String, options As BarcodeReaderOptions) As BarcodeResults
Dim sw As Stopwatch = Stopwatch.StartNew() ' start timing before the read so setup overhead is included
Try
Dim results As BarcodeResults = 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 ex As Exception
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
End Try
End Function
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
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.
Lote 1 — Digitalização 1
Lote 1 — Digitalização 2
Lote 1 — Digitalização 3
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}");
}
}
Imports IronBarCode
Imports IronBarCode.Exceptions
Imports 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
Dim files As String() = Directory.GetFiles("scans/", "*.*", SearchOption.TopDirectoryOnly)
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced, ' balances throughput vs accuracy
.ExpectBarcodeTypes = BarcodeEncoding.Code128 Or 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)
Dim successCount As Integer = 0
Dim failCount As Integer = 0
Dim emptyCount As Integer = 0
Dim errors As New List(Of (File As String, Error As String))() ' per-file error context for root cause analysis
Dim sw As Stopwatch = Stopwatch.StartNew()
For Each file As String In files
Try
Dim results As BarcodeResults = BarcodeReader.Read(file, options)
' Empty result is not an exception — the file was read but contained no matching barcode
If results Is Nothing OrElse results.Count = 0 Then
emptyCount += 1
errors.Add((file, "No barcodes detected")) ' record so caller can adjust options
Continue For
End If
For Each result As BarcodeResult In results
Console.WriteLine($"{Path.GetFileName(file)} | {result.BarcodeType} | {result.Value}")
Next
successCount += 1
Catch ex As IronBarCodePdfPasswordException
' PDF is password-protected — supply password via PdfBarcodeReaderOptions to recover
failCount += 1
errors.Add((file, "Password-protected PDF"))
Catch ex As IronBarCodeFileException
' File is corrupted, locked, or in an unsupported image format
failCount += 1
errors.Add((file, $"File error: {ex.Message}"))
Catch ex As FileNotFoundException
' File was in the directory listing but deleted before the read completed (race condition)
failCount += 1
errors.Add((file, $"File not found: {ex.Message}"))
Catch ex As IronBarCodeException
' Catch-all for any other IronBarcode-specific errors not handled above
failCount += 1
errors.Add((file, $"{ex.GetType().Name}: {ex.Message}"))
Catch ex As Exception
' Unexpected non-IronBarcode error — log the full type for investigation
failCount += 1
errors.Add((file, $"Unexpected: {ex.GetType().Name}: {ex.Message}"))
End Try
Next
sw.Stop()
' Summary report — parse failCount > 0 in CI/CD to set a non-zero exit code
Console.WriteLine(vbCrLf & "--- 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() Then
Console.WriteLine(vbCrLf & "--- Error Details ---")
For Each errorDetail In errors
Console.Error.WriteLine($" {Path.GetFileName(errorDetail.File)}: {errorDetail.Error}")
Next
End If
Saída
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
- Tutoriais IronBarcode : Leitura de códigos de barras : passo a passo completo da leitura.
- Prevenção de falsos positivos : redução de leituras fantasmas em imagens ruidosas.
- Tutorial de correção de imagens : filtros que melhoram a precisão da leitura.
- Guia de configuração do Docker : implantação em contêineres com as dependências nativas corretas.
- Referência da API BarcodeReaderOptions : documentação completa de configuração.
- Registro de alterações do IronBarcode : correções específicas da versão e adições de recursos.
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.

