https://foro.gambas-es.org/viewtopic.php?f=1&t=6947
-----------------------------------
Shell
Lunes, 07 May 2018, 08:52

Control De Errores En Una Aplicación De Consola
-----------------------------------
Buenos días!. 

Comienzo de semana. Si el humor de los viandantes se reflejase con un emoticono sobre la cabeza, habría muchos repetidos del mismo. "Felicidad!".  :twisted: 

Se me presenta un problema con el control de errores de una aplicación de consola.
Que puede que sea igual que en una de formulario.

La mayoría de los lenguajes tienen un control de errores parecidos. En algunos se expande un poco.
En este caso vengo de un ejemplo en Python y quiero hacer algo parecido en Gambas.
Se trata de controlar las dimensiones de un tablero. En este tablero el número de losetas, cuadrados, escaques debe ser par.
[b]Debe cumplirse una condición[/b]. Así por ejemplo tengo dos constantes definidas al principio:

[code linenumbers=false syntax=gambas]
Const TABLEROANCHO As Integer = 10
Const TABLEROALTO As Integer = 7
[/code]

Ahora bien. Para saber si son par:  Si yo hiciera algo como esto:

[code linenumbers=false syntax=gambas]
If (TABLEROANCHO * TABLEROALTO) Mod 2 = 1 Then Error.Raise("Tablero necesita tener un número par de cajas para que coincidan parejas.")
[/code]
La aplicación se para dando el consiguiente error:

[quote]
Main.Main.9: Tablero necesita tener un número par de cajas para que coincidan parejas.
Main.Main.9 
[/quote]

El error se me mostraría dentro del editor y parece que también en la consola. Al crear el ejecutable también lo acabo de ver.
En Python existe un comando llamado Assert.

[quote]
The "assert" statement
**********************

Assert statements are a convenient way to insert debugging assertions
into a program:

   assert_stmt ::= "assert" expression ["," expression]

The simple form, "assert expression", is equivalent to

   if __debug__:
       if not expression: raise AssertionError

The extended form, "assert expression1, expression2", is equivalent to

   if __debug__:
       if not expression1: raise AssertionError(expression2)

These equivalences assume that "__debug__" and "AssertionError" refer
to the built-in variables with those names.  In the current
implementation, the built-in variable "__debug__" is "True" under
normal circumstances, "False" when optimization is requested (command
line option -O).  The current code generator emits no code for an
assert statement when optimization is requested at compile time.  Note
that it is unnecessary to include the source code for the expression
that failed in the error message; it will be displayed as part of the
stack trace.

Assignments to "__debug__" are illegal.  The value for the built-in
variable is determined when the interpreter starts.
[/quote]

Así es como lo tengo en el ejemplo:

[code linenumbers=false syntax=python]
assert (TABLEROANCHO * TABLEROALTO) % 2 == 0, 'Tablero necesita tener un número par de cajas para que coincidan parejas.'
[/code]

En caso de error (dimensiones incorrectas definidas en las constantes )  mostraría:

[quote]
Traceback (most recent call last):
  File "/home/..../Programacion/Python/HaciendoJuegosConPyGame/Capitulo3_Memory_Puzzle/memoriapuzzle.py", line 13, in <module>
    assert (TABLEROANCHO * TABLEROALTO) % 2 == 0, 'Tablero necesita tener un número par de cajas para que coincidan parejas.'
AssertionError: Tablero necesita tener un número par de cajas para que coincidan parejas.
[Finished in 1.0s with exit code 1]
[/quote]

En Gambas después del Raise ya no podría conocer más información si usara la clase Error. 
Ejemplo, tipo, línea...

Podría haber añadido algo parecido a esto:

[code linenumbers=false syntax=gambas]
Public Sub Main()
  
  If (TABLEROANCHO * TABLEROALTO) Mod 2 = 1 Then Error.Raise("Tablero necesita tener un número par de cajas para que coincidan parejas.")
  
Catch
  Print Error.Text
  Print Error.Code
  Print Error.Class
  Print Error.Where
  
  Print "Y esto ?"
  
End
[/code]

El mensaje de Error.Raise no se muestra, pero si muestra la información a continuación del Catch.  Claro que también se mostraría el mensaje del final.
No se pararía la ejecución que e lo que hace Error.Raise.

Rectifico, si lo ejecuto y veo la salida de consola del editor:

[quote]
Tablero necesita tener un número par de cajas para que coincidan parejas.
-1
(Class 0x10377f8)
Main.Main.9
Y esto ?
[/quote]

Y si lo ejecuto como ejecutable:

[quote]
Tablero necesita tener un número par de cajas para que coincidan parejas.
-1
(Class 0x14f7978)
Main.Main.9
[/quote]

Parece que se para.. :???: 

Saludos


-----------------------------------
Shell
Lunes, 07 May 2018, 09:11

Re: Control De Errores En Una Aplicación De Consola
-----------------------------------
Si hubiese usado el emulador de terminal de Gambas:

 [img]https://foro.gambas-es.org/files/images/768/emuladordeterminaldegambas.png[/img] 

Sigue mostrándose el mensaje del final.

Saludos


-----------------------------------
Shell
Lunes, 07 May 2018, 09:20

Re: Control De Errores En Una Aplicación De Consola
-----------------------------------
Como condición..

[code linenumbers=false syntax=gambas]
Public Sub Main()
   
  valor = (TABLEROANCHO * TABLEROALTO) Mod 2
  
  If valor = 0 Then
    Print "Par..."
  Else
    Debug "Tablero necesita tener un número par de cajas para que coincidan parejas."
   ' Código para parar ejecución
  Endif
[/code]

¿ Pararíais ahí de alguna forma ?.

Saludos


-----------------------------------
jsbsan
Lunes, 07 May 2018, 11:59

Re: Control De Errores En Una Aplicación De Consola
-----------------------------------
Shell:
[quote]¿ Pararíais ahí de alguna forma ?.[/quote]
Usando el comando quit

http://gambaswiki.org/wiki/lang/quit


-----------------------------------
Shell
Lunes, 07 May 2018, 13:53

Re: Control De Errores En Una Aplicación De Consola
-----------------------------------
Julio:

[quote]
Usando el comando quit
[/quote]

Ostras. Hace años que no veía esta instrucción. Como normalmente en formularios uso Me.Close,
se va olvidando quit.

Parece que da problemas con aplicaciones con formularios. Jeje, dice que se cerrará lo mejor posible.  
Creo que a más de uno de nosotros nos tiene que haber dado un quebradero de cabeza esta instrucción con formularios.

Mejor para consola, perfecto.  Visto así poco control de errores tiene.  :???: 

[code linenumbers=false syntax=gambas]
  If valor = 0 Then
    Print "Par..."
  Else
    Debug "Tablero necesita tener un número par de cajas para que coincidan parejas."
    Quit
  Endif
[/code]
A ver si le puedo añadir algún detalle para conocer algo más del error.
Debe ser una instrucción muy repetida para casos de ese tipo. Mensaje de error y salida.

Gracias.  ;-) 

P.d ¿ Soléis usar número de líneas en el código ?.  Puede ser complicado buscar un error sin número de línea.
Ya se que recuerda a viejos basic's. :-)

Saludos


-----------------------------------
jsbsan
Lunes, 07 May 2018, 19:27

Re: Control De Errores En Una Aplicación De Consola
-----------------------------------
Shell:

[quote]¿ Soléis usar número de líneas en el código ?. [/quote]
Yo los pongo para que se vean. Asi si hay algun error, los puedo localizar rápidamente.


-----------------------------------
shordi
Martes, 08 May 2018, 12:45

Re: Control De Errores En Una Aplicación De Consola
-----------------------------------
Yo siempre muestro la combinación error.text;;error.where en los errores.
Sin embargo del tema que aquí se habla, la introducción de números distintos por parte del usuario, creo que está mal planteado: No es un error del programa, es un mal manejo del usuario. 
Deja la gestión de errores para los errores del programa, es decir, para situaciones no contempladas previamente y depura los datos para avisar, repetir, explicar etc. los eventos generados por el usuario.

Saludos


-----------------------------------
Shell
Jueves, 10 May 2018, 07:38

Re: Control De Errores En Una Aplicación De Consola
-----------------------------------
Shordi:

Es que en este caso, es algo como en producción, aun no habrá llegado a manos del usuario.
Todas esas constantes que maneja la aplicación pueden ser cambiadas y con eso cambiará 
la presentación del tamaño del tablero, de cada celda de este, el tamaño del icono dentro estas.
Si no se provoca o se llama la atención a hacerlo, no se puede ver el efecto que causa.

Es un código que esta abierto. En parte es que estos códigos son para iniciarse en la creación de juegos
mediante un lenguaje de programación. 

El uso de estas constantes enseña al programador a valorar el uso de estas, antes que usar variables
que puedan cambiarse al escribir. 

Es un cambio de crear juegos de consola a una interfaz gráfica mediante una librería.
Un aprendizaje que cambia con cada nuevo juego. 

Aunque intento implementar la creación de un juego de un lenguaje y traerlo a Gambas,
luego resulta que me encuentro cosas muy diferentes, aunque se llamen igual.  :evil: 


Saludos


