Cómo manejar errores y depurar operaciones de códigos de barras en C

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

Los procesos de procesamiento de BarCodes pueden fallar de forma silenciosa, y la ausencia de resultados a menudo se confunde con "no hay BarCode presente". Sin embargo, problemas como archivos dañados, archivos PDF protegidos con contraseña o incompatibilidades de formato pueden ser los responsables. La implementación de un registro adecuado y una gestión estructurada de los errores permite detectar estos fallos y proporciona diagnósticos útiles.

IronBarcode ofrece una jerarquía de excepciones tipadas en el espacio de nombres IronBarCode.Exceptions, una API de registro integrada y propiedades detalladas de BarcodeResult. Estas propiedades incluyen el formato detectado, el valor descodificado, el número de página y las coordenadas de cada descodificación correcta.

Esta guía explica cómo capturar e interpretar excepciones tipadas, extraer contexto de diagnóstico de lecturas fallidas, habilitar el registro estructurado y aislar fallos durante operaciones por lotes.

Inicio rápido: Manejar errores de código de barras y habilitar diagnósticos

Envuelva las llamadas de lectura/escritura en bloques try-catch dirigidos a las excepciones tipificadas de IronBarcode para resaltar mensajes de error procesables en lugar de fallos silenciosos.

  1. Instala IronBarcode con el Administrador de Paquetes NuGet

    PM > Install-Package BarCode
  2. Copie y ejecute este fragmento 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. Despliegue para probar en su entorno real

    Comienza a usar IronBarcode en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer

¿Cómo puedo detectar e interpretar las excepciones de IronBarcode?

Captura las excepciones de IronBarcode, desde las más específicas hasta las más generales. Ordena los bloques catch para gestionar primero las excepciones procesables, como los errores de archivo, de contraseña de PDF y de codificación, seguidos del tipo base. El espacio de nombres IronBarCode.Exceptions define 11 tipos de excepciones, cada uno de los cuales corresponde a un modo de fallo específico:

Tipos de excepciones de IronBarcode — Causas y soluciones recomendadas
Tipo de excepciónDesencadenanteSolución recomendada
IronBarCodeFileExceptionEl archivo está dañado, bloqueado o tiene un formato de imagen no compatibleComprueba que el archivo tenga un formato de imagen compatible y que no esté bloqueado; además, detecta por separado las excepciones FileNotFoundException para los archivos que falten.
IronBarCodePdfPasswordExceptionPDF protegido por contraseña o encriptadoSuministre la contraseña a través de PdfBarcodeReaderOptions, o salte el archivo y registre
IronBarCodeEncodingExceptionFallo genérico de codificación durante la generación de código de barrasVerifique que los datos de entrada coincidan con las restricciones de BarcodeWriterEncoding objetivo
IronBarCodeContentTooLongEncodingExceptionEl valor excede el límite de caracteres para la simbología seleccionadaTrunque los datos o cambie a un formato de mayor capacidad (QR, DataMatrix)
IronBarCodeFormatOnlyAcceptsNumericValuesEncodingExceptionCaracteres no numéricos pasados a un formato de solo numérico (EAN, UPC)Limpie la entrada o cambie a un formato alfanumérico (Code128, Code39)
IronBarCodeUnsupportedRendererEncodingExceptionLa codificación seleccionada BarcodeEncoding no es escribible por IronBarcodeUse el enumerador BarcodeWriterEncoding en lugar de BarcodeEncoding
IronBarCodeParsingExceptionLos datos estructurados (GS1-128) fallan en la validación durante el análisisValide la estructura GS1 con Code128GS1Parser.IsValid() antes de analizar
IronBarCodeNativeExceptionError en la capa de interoperabilidad nativa (DLLs faltantes, incompatibilidad de plataforma)Verifique que los paquetes específicos de la plataforma NuGet estén instalados (BarCode.Linux, BarCode.macOS)
IronBarCodeConfidenceThresholdExceptionArgumento de umbral de confianza inválido pasado a opciones de lectorAsegúrese de que ConfidenceThreshold esté entre 0.0 y 1.0
IronBarCodeUnsupportedExceptionOperación no soportada en el contexto actualConsulte el registro de cambios para disponibilidad de características en su versión
IronBarCodeExceptionTipo base — captura cualquier error específico de IronBarcode no coincidente arribaRegistre los detalles completos de la excepción y escale para la investigación

Utilice filtros de excepciones con cláusulas when para enrutar tipos de excepciones superpuestas sin anidamientos profundos. Los archivos que faltan lanzan el error estándar System.IO.FileNotFoundException en lugar de IronBarCodeFileException, así que incluye un bloque catch independiente para este caso:

Entrada

Un BarCode Code128 que codifica un número de factura (ruta de éxito) y un BarCode de etiqueta de almacén que representa el contenido del PDF que falta (ruta de error).

Codificación de BarCode Code128 INV-2024-7829 utilizada como entrada de factura escaneada
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

Resultado

Por favor notaUn archivo válido se resuelve en el tipo y el valor del BarCode descodificado.

Salida de la consola que muestra la decodificación correcta de Code128: [Code128] INV-2024-7829

Un archivo que falta desencadena FileNotFoundException, enrutado por el bloque catch dedicado.

Salida de la consola que muestra una excepción FileNotFoundException por la falta del archivo warehouse-labels.PDF

El filtro when (ex.Message.Contains("DLL")) en IronBarCodeNativeException dirige los errores de dependencias faltantes a un controlador específico sin afectar a otras excepciones nativas. Este enfoque resulta especialmente útil en implementaciones de Docker, donde pueden faltar paquetes específicos de la plataforma.

IronSoftware.Exceptions.LicensingException se genera por separado cuando la clave de licencia no es válida o falta. Detecta esta excepción al inicio de la aplicación en lugar de en cada llamada de lectura o escritura individual.


¿Cómo extraigo los detalles de diagnóstico de las lecturas fallidas?

Una operación de lectura que devuelve cero resultados no es una excepción; produce una colección BarcodeResults vacía. El contexto de diagnóstico se obtiene inspeccionando los parámetros de entrada, las opciones configuradas y cualquier resultado parcial devuelto.

El objeto BarcodeResult proporciona propiedades útiles para el análisis post mortem, incluyendo BarcodeType, Value, PageNumber y Points (coordenadas de las esquinas). Si hay resultados pero son inesperados, compruebe primero BarcodeType con respecto al formato esperado y verifique el PageNumber.

Entrada

Un BARCODE Code128 que codifica un número de factura, leído con ExpectBarcodeTypes establecido en Code128 y QRCode, y ReadingSpeed.Detailed para un escaneo exhaustivo.

Codificación de BarCode Code128 INV-2024-7829 utilizada como entrada de factura escaneada
: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

Resultado

Por favor notaCuando ExpectBarcodeTypes coincide con el BARCODE de la imagen, la lectura devuelve el tipo, el valor, el número de página y la posición.

Salida de consola que muestra la decodificación correcta de Code128 con el número de página y las coordenadas de posición

Si ExpectBarcodeTypes no incluye la simbología real, la lectura devuelve un resultado vacío. El bloque [WARN] registra los tipos configurados, la velocidad de lectura y una sugerencia de acción a seguir.

Salida de la consola que muestra [WARN] no se han encontrado BarCodes con ExpectBarcodeTypes establecido en Code39 para una imagen Code128

Durante el diagnóstico surgen dos patrones comunes. Los resultados vacíos con una configuración estrecha de ExpectBarcodeTypes suelen significar que el BARCODE utiliza una simbología diferente; Ampliando a BarcodeEncoding.All se puede confirmar esto. Los resultados de decodificación inesperados suelen indicar una mala calidad de la imagen.

Aplicar filtros de imagen y volver a intentarlo con una velocidad de lectura más lenta suele resolver estos problemas. También puede activar la opción RemoveFalsePositive para eliminar lecturas fantasma de fondos ruidosos.

¿Cómo activo el registro detallado para las operaciones con BarCodes?

IronBarcode expone una API de registro integrada a través de IronSoftware.Logger. Configure el modo de registro y la ruta del archivo antes de realizar cualquier operación con BarCodes para capturar la salida de diagnóstico interna de los procesos de lectura y escritura.

Entrada

Una imagen TIFF de BarCode Code128 utilizada como objetivo de lectura mientras el registro detallado está activo.

Codificación de BarCode Code128 PROB-SCAN-999 utilizada como entrada de escaneo de prueba para el ejemplo 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 la salida de depuración como el registro a nivel de archivo. El archivo de registro recoge los pasos de procesamiento internos, como las etapas de preprocesamiento de imágenes, los intentos de detección de formato y las llamadas de interoperabilidad nativas, que no son visibles a través de la API pública.

En los flujos de trabajo de producción que utilizan un marco de registro estructurado (Serilog, NLog, Microsoft.Extensions.Logging), al envolver las operaciones de IronBarcode en una capa de middleware se añaden entradas JSON estructuradas junto con el archivo de registro integrado. El registrador integrado escribe diagnósticos en texto sin formato útiles para la escalación de incidencias; El contenedor estructurado proporciona campos consultables para la pila de observabilidad.

: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

El resultado estructurado se integra directamente con herramientas de agregación de registros. Envía stdout a Fluentd, Datadog o CloudWatch en una implementación en contenedores. El campo de tiempo transcurrido destaca las regresiones de rendimiento antes de que se conviertan en incumplimientos del SLA.

Resultado

Salida de la consola que muestra una lectura correcta del BarCode con el registro detallado habilitado y la ruta del archivo de registro

¿Cómo depuro el procesamiento por lotes de BarCodes?

Procesa varios archivos aislando cada lectura en su propio bloque try-catch, registrando los resultados de cada archivo y generando un resumen agregado. El proceso continúa a pesar de los fallos, en lugar de detenerse ante el primer error.

Entrada

Cuatro de las cinco imágenes de BarCodes Code128 del directorio de lotes scans/. El quinto archivo (scan-05-broken.png) contiene bytes no válidos que provocan una excepción de archivo.

Code128 barcode encoding ITEM-SQ-001

Lote 1 — Escaneo 1

Code128 barcode encoding ITEM-SQ-002

Lote 1 — Escaneo 2

Code128 barcode encoding ITEM-SQ-003

Lote 1 — Escaneo 3

Code128 barcode encoding ITEM-SQ-004

Lote 1 — Escaneo 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

Resultado

Salida de la consola que muestra el resumen del lote: 4 éxitos, 1 fallo, con detalles del error del archivo dañado

Durante la ejecución, la consola muestra una línea por cada BarCode descodificado, seguida de un resumen con el recuento de archivos, los éxitos, las lecturas vacías, los fallos y el tiempo transcurrido. Los errores se enumeran con sus correspondientes nombres de archivo y los motivos del fallo.

El proceso distingue tres categorías de resultados: éxito (BarCodes encontrados y descodificados), vacío (archivo leído pero sin BarCodes detectados) y fallo (excepción lanzada). Esta distinción es importante porque las lecturas vacías y los errores requieren respuestas diferentes. Las lecturas vacías pueden requerir ajustes de formato más amplios, mientras que los errores suelen indicar problemas de infraestructura, como archivos que faltan, recursos bloqueados o dependencias nativas que faltan.

La lista de errores mantiene el contexto de cada archivo para facilitar el análisis de la causa raíz. En un proceso de CI/CD, analice esta salida para establecer códigos de salida (cero para indicar éxito total y distinto de cero cuando failCount sea mayor que cero) o reenvíe los detalles del error a un sistema de alertas.

Para un mayor rendimiento, habilite el procesamiento paralelo configurando Multithreaded en true y ajustando MaxParallelThreads para que coincida con los núcleos de CPU disponibles. Mantenga el aislamiento por archivo envolviendo la iteración paralela en Parallel.ForEach y utilizando una colección segura para subprocesos para la lista de errores.


Más información

Consulte las opciones de licencia cuando el proceso esté listo para la producción.

Preguntas Frecuentes

¿Cómo puedo manejar errores en operaciones de códigos de barras usando IronBarcode?

IronBarcode proporciona excepciones tipadas y registro incorporado para gestionar y manejar eficientemente errores en operaciones de códigos de barras, asegurando que tu aplicación funcione sin problemas.

¿Qué características ofrece IronBarcode para depurar problemas de códigos de barras?

IronBarcode incluye extracción de diagnóstico y aislamiento de errores por lotes listo para producción, los cuales ayudan a los desarrolladores a identificar y resolver problemas relacionados con códigos de barras de manera eficiente.

¿Puede IronBarcode registrar errores durante el procesamiento de códigos de barras?

Sí, IronBarcode tiene capacidades de registro integrado que permiten a los desarrolladores capturar y registrar detalles de errores durante el procesamiento de códigos de barras, facilitando una depuración más fácil.

¿Qué son las excepciones tipadas en IronBarcode?

Las excepciones tipadas en IronBarcode son tipos de error específicos que proporcionan información detallada sobre los problemas de operación de códigos de barras, facilitando a los desarrolladores diagnosticar y reparar problemas.

¿Cómo asiste IronBarcode con el aislamiento de errores por lotes?

IronBarcode ofrece aislamiento de errores por lotes listo para producción, lo cual ayuda a separar operaciones de códigos de barras erróneas de las exitosas, agilizando la gestión de errores en el procesamiento por lotes.

¿Existe una manera de extraer diagnósticos de operaciones de códigos de barras usando IronBarcode?

Sí, IronBarcode proporciona herramientas de extracción de diagnóstico que ayudan a los desarrolladores a recopilar información detallada sobre las operaciones de códigos de barras, ayudando en la resolución de problemas y errores.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 2,121,847 | Versión: 2026.3 recién lanzado
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package BarCode
ejecuta una muestra observa cómo tu cadena se convierte en un código de barras.