Joven hacker sonriendo

Manejar Errores en Operaciones Aritméticas

Necesidad

Manejar errores en operaciones aritméticas en COBOL.

Contexto

A continuación se describe las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está desarrollando una aplicación en COBOL.

  2. La aplicación realiza operaciones aritméticas con las instrucciones ADD, SUBTRACT, MULTIPLY, DIVIDE, o COMPUTE.

  3. El código sólo debe realizar las funciones para las cuales fue diseñado y no acciones colaterales[1].

  4. El sistema debe evitar difundir información sensible al momento de ocurrir un evento excepcional[2].

Solución

  1. Las operaciones aritméticas pueden causar ciertos tipos de error que generalmente resultan en mensajes MCH. Al usar las instrucciones ADD, SUBTRACT, MULTIPLY, DIVIDE o COMPUTE, es posible controlar estos errores mediante el uso de la instrucción ON SIZE ERROR.

  2. Las siguientes condiciones son manejadas a través de la instrucción ON SIZE ERROR:

    • La longitud del resultado de la operación aritmética es mayor a la longitud del número que lo contiene.

    • División por cero.

    • Cero elevado a la cero.

    • Cero elevado a un número negativo.

    • Número negativo elevado a un fraccionario.

    • Desbordamiento de números flotantes.

  3. A continuación podrá evidenciar el uso de la instrucción ON SIZE ERROR:

    • Se define la división IDENTIFICATION DIVISION[3],[4].

      cobolonsz.cbl
      1
      2
      3
      4
      5
             IDENTIFICATION DIVISION.
            ******************
            * Identification *
            ******************
             PROGRAM-ID. COBOLONSZ.
      
    • La división de datos contendrá la variable W01-TOTALAMOUNT, la cual tiene como propósito almacenar el monto total de una persona en el banco (note como la longitud del dato es de 6 dígitos).

      1
      2
      3
      4
      5
      6
      7
            ********
            * Data *
            ********
             DATA DIVISION.
      
             WORKING-STORAGE SECTION.
             01 W01-TOTALAMOUNT PIC 9(06) VALUE 0.
      
    • A continuación, se define la división PROCEDURE DIVISION[5] donde inicia el programa.

      1
      2
      3
      4
      5
            ********
            * Main *
            ********
             PROCEDURE DIVISION.
             MAIN.
      
    • Luego se suma el monto total de $500.000, $400.000 y $300.000. El resultado es almacenado en W01-TOTALAMOUNT (Si ocurre una excepción, CALC-ERROR es el encargado de manejar el problema).

      1
      2
             ADD 500000 400000 300000 TO W01-TOTALAMOUNT
             ON SIZE ERROR PERFORM CALC-ERROR.
      
    • Se despliega en pantalla el monto total.

      1
      2
             DISPLAY W01-TOTALAMOUNT.
             STOP RUN.
      
    • En esta sección es posible tratar el desbordamiento como un error, para el ejemplo mostraremos una advertencia.

      1
      2
      3
             CALC-ERROR.
                 DISPLAY "Arithmetic overflow".
                 STOP RUN.
      
    • En este caso es mostrada la excepción debido a que la suma total del monto ($1.200.000), supera la longitud esperada en la variable W01-TOTALAMOUNT.

    • Se debe redefinir la variable con el objetivo de almacenar números más grandes.

      1
      2
      3
      4
      5
      6
      7
            ********
            * Data *
            ********
             DATA DIVISION.
      
             WORKING-STORAGE SECTION.
             01 W01-TOTALAMOUNT PIC 9(63) VALUE 0.
      

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. cobolonsz.cbl >> contiene todas las instrucciones COBOL con la variable W01-TOTALAMOUNT redefinida (sin desbordamiento).

Referencias

  1. REQ.0149: El código fuente de un sistema no debe realizar funciones diferentes a las que han sido especificadas en los requisitos funcionales (puertas traseras).

  2. REQ.0077: El sistema no debe registrar información sensible en un evento excepcional de una bitácora.

  3. IBM - Identification Division.

  4. Identification Division.

  5. COBOL Procedure Division.




Haz un comentario