Curso de Cobol y PowerCobol

¿Cómo funciona ON SIZE ERROR?

Capítulo 28: Manejo de errores con ON SIZE ERROR

Volvemos con las operaciones aritméticas. Esta vez con un tema nuevo, el manejo de errores con ON SIZE ERROR.

ON SIZE ERROR

Cuando creamos una operación de cálculo, debemos contemplar los posibles valores devueltos según el tamaño del PICTURE. Hasta ahora, no podías expresar en la consola algún tipo de aviso de que el número es demasiado grande. Este solo aparece cortado.

⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo28.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77 Numero1 PIC 999 VALUE 200.
       77 Numero2 PIC 999 VALUE 100.
       77 Resultado PIC 999 VALUE ZEROS.

       PROCEDURE DIVISION.
       Calculos.
       COMPUTE Resultado = Numero1 * Numero2.

       DISPLAY Resultado.

       STOP RUN.
       END PROGRAM Capitulo28.

Pese a que el resultado debería ser 20000, tan solo le alcanza para almacenar los tres últimos números debido al tamaño del PICTURE.

000

Podemos avisar al usuario de que el número es demasiado grande con ON SIZE ERROR (En error de tamaño).

⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo28.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77 Numero1 PIC 999 VALUE 200.
       77 Numero2 PIC 999 VALUE 100.
       77 Resultado PIC 999 VALUE ZEROS.

       PROCEDURE DIVISION.
       Calculos.
       COMPUTE Resultado = Numero1 * Numero2
           ON SIZE ERROR DISPLAY "El número es muy grande, no se "-
           "visualiza entero."
       END-COMPUTE

       DISPLAY Resultado.

       STOP RUN.
       END PROGRAM Capitulo28.
El número es muy grande, no se visualiza entero.
000

No solo nos podemos limitar a una frase como un DISPLAY, podemos poner en el bloque de código COMPUTE todo el código que necesitemos, antes de su cierre con el END-COMPUTE.

⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo28.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77 Numero1 PIC 999 VALUE 200.
       77 Numero2 PIC 999 VALUE 100.
       77 Resultado PIC 999 VALUE ZEROS.

       PROCEDURE DIVISION.
       Calculos.
       COMPUTE Resultado = Numero1 * Numero2
           ON SIZE ERROR
           DISPLAY "El número es muy grande, no se "-
           "visualiza entero."
           DISPLAY "Se ha establecido el valor por defecto (200)"
           MOVE 200 TO Resultado
       END-COMPUTE

       DISPLAY Resultado.

       STOP RUN.
       END PROGRAM Capitulo28.
El número es muy grande, no se visualiza entero.
Se ha establecido el valor por defecto (200)
200

Si el valor no da error de tamaño, en este caso, se omite todo el código del ON SIZE ERROR.

 COMPUTE Resultado = Numero1 + Numero2
300

Tenemos la posibilidad de utilizar ON SIZE ERROR con el resto de palabras para operaciones como ADD o SUBTRACT. Solo tienes que utilizar el END correcto en cada caso.

⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo28.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77 Numero1 PIC 99 VALUE 99.
       77 Numero2 PIC 99 VALUE 80.
       77 Resultado PIC 99 VALUE ZEROS.

       PROCEDURE DIVISION.
       Calculos.
       ADD Numero1 TO Numero2 GIVING Resultado
           ON SIZE ERROR
           DISPLAY "El número es muy grande, no se "-
           "visualiza entero."
       END-ADD

       DISPLAY Resultado.

       STOP RUN.
       END PROGRAM Capitulo28.
El número es muy grande, no se visualiza entero.
00

Así sería con los otros tres:

SUBTRACT Numero1 FROM Numero2 GIVING Resultado
	ON SIZE ERROR
	DISPLAY "El número es muy grande, no se "-
	"visualiza entero."
END-SUBTRACT
MULTIPLY Numero1 BY Numero2 GIVING Resultado
	ON SIZE ERROR
	DISPLAY "El número es muy grande, no se "-
	"visualiza entero."
END-MULTIPLY
DIVIDE Numero1 BY Numero2 GIVING Resultado
	ON SIZE ERROR
	DISPLAY "El número es muy grande, no se "-
	"visualiza entero."
END-DIVIDE

NOT ON SIZE ERROR

Tenemos la posibilidad de expresar además un bloque con código en caso de que el valor introducido se corresponda con el PICTURE.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo28.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77 Numero1 PIC 999 VALUE 200.
       77 Numero2 PIC 999 VALUE 100.
       77 Resultado PIC 999 VALUE ZEROS.

       PROCEDURE DIVISION.
       Calculos.
       COMPUTE Resultado = Numero1 * Numero2
           ON SIZE ERROR
           DISPLAY "El número es muy grande, no se "-
           "visualiza entero."
           DISPLAY "Se ha establecido el valor por defecto (200)"
           MOVE 200 TO Resultado
           NOT ON SIZE ERROR
           DISPLAY "El valor es: " Resultado
       END-COMPUTE

       STOP RUN.
       END PROGRAM Capitulo28.
El número es muy grande, no se visualiza entero.
Se ha establecido el valor por defecto (200)

No obstante, si no hay error de tamaño, se va a ejecutar lo del bloque NOT ON SIZE ERROR (he cambiado la multiplicación por suma para que no de error de tamaño).

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo28.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77 Numero1 PIC 999 VALUE 200.
       77 Numero2 PIC 999 VALUE 100.
       77 Resultado PIC 999 VALUE ZEROS.

       PROCEDURE DIVISION.
       Calculos.
       COMPUTE Resultado = Numero1 + Numero2
           ON SIZE ERROR
           DISPLAY "El número es muy grande, no se "-
           "visualiza entero."
           DISPLAY "Se ha establecido el valor por defecto (200)"
           MOVE 200 TO Resultado
           NOT ON SIZE ERROR
           DISPLAY "El valor es: " Resultado
       END-COMPUTE

       STOP RUN.
       END PROGRAM Capitulo28.
El valor es: 300

De esta forma, vamos a evitar tener el DISPLAY con el resultado o cualquier otro código fuera del COMPUTE. Así lo tenemos con una mejor organización, lo tenemos todo agrupado en un mismo sitio.


Comentarios

Si te quedan dudas sobre el temario, sobre Cobol, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.