Como usar captura de excepciones (Try Catch)

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
dertin
Mensajes: 12
Registrado: 12 Sep 2010, 19:11
Ubicación: Uruguay
Contactar:

Como usar captura de excepciones (Try Catch)

Mensaje por dertin »

Hola!, tengo tres codigos donde cada uno de ellos resuelve un mismo problema de diferente modo o forma, y quiero que si el primer modo fallara salte al segundo modo y si este tambien falla saltar al tercero. Vi que hay una variable @error, pero no se como implementar bien esto.

- Como pueden ver en los tres codigos al final del post, (los cuales no eh probado) lo que quieren resolver es que mi programa escrito en Autoit que esta en el directorio (%windir%\miprograma.exe) se inicie al momento de Iniciar Sesion -

Primer Modo:

Código: Seleccionar todo

#include "ServiceControl.au3"
$servicename = "Service Name"
_CreateService("", $servicename, "Hola Mundo", "srvany.exe", "LocalSystem", "", 0x110)
RegWrite("HKLM\SYSTEM\CurrentControlSet\Services\" & $servicename & "\Parameters", "Application", "REG_SZ", %windir%\miprograma.exe)
RegWrite("HKLM\SYSTEM\CurrentControlSet\Services\" & $servicename, "Type", "REG_DWORD", 0x110)
_StartService($servicename)
Segundo Modo:

Código: Seleccionar todo

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "Userinit", "REG_SZ", "%windir%\System32\userinit.exe,%windir%\miprograma.exe")
Tercer Modo:

Código: Seleccionar todo

RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "winhelp", "REG_SZ", "%windir%\miprograma.exe")
Bueno, Espero haber sido claro con lo que estoy buscando, es algo similar a un Try Catch,
Gracias. :smt001
Será mejor darse prisa y empezar a programar, serán muchos errores que corregir.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Como usar captura de excepciones (Try Catch)

Mensaje por Ximorro »

Hum, perdona que sospeche pero no sabes cómo comprobar algo tan sencillo como la macro @error, tienes tres códigos que no has probado (o sea, que tampoco son tuyos), ¡y estás intentando instalar nada menos que un servicio! Espero que tus intenciones sean buenas... :smt017

¿Estás seguro que lo que quieres es que tu programa se inicie con la sesión? Hay una manera mucho más sencilla que instalar servicios del sistema: pon un acceso directo en la carpeta Programas\Inicio. Si quieres hacerlo por código puedes usar las macros @StartupCommonDir o @StartupDir

Respecto a los errores pues sólo se trata de comprobar si ha habido error, y si es así pasar al siguiente método, si no hay error hemos terminado. Hay que mirar la documentación para ver cómo da cada función el error, ciertamente AutoIt ofrece el mecanismo de la macro @error pero hay funciones que necesitan dar más información que un simple código de error y usan otros métodos o usan sistemas complementarios. Será bastante raro que no usen @error pero no está de más mirarlo en la documentación.
En tu caso (aunque repito, lo del servicio es sobrecomplicarse para la tarea que quieres hacer) por ejemplo RegWrite efectivamente usa @error, devuelve hasta 5 códigos diferentes de error, 0 si es correcto. Además la propia función devuelve 1 cuando se ha ejecutado correctamente, así que esa es otra manera de comprobarlo.
La librería ServiceControl no la tengo, así que no puedo mirar sus funciones, pero será algo parecido.

La cosa es que simplemente hay que comprobar @error para ver si falla y actuar en consecuencia. El esquema podría ser el siguiente:

Código: Seleccionar todo

Método 1
If @error Then
	Método 2
	If @error Then
		Método 3
	EndIf
EndIf
Si hay muchos métodos puedes simplificar el anidamiento de IF si se finaliza el script cuando se encuentra uno que no da error:

Código: Seleccionar todo

Método 1
If Not @error Then Exit
Método 2
If Not @error Then Exit
Método 3
Este sería el caso general, como digo hay que mirar la documentación cada función. En el caso de RegWrite, ya que la función devuelve el estado de la ejecución, lo normal será mirarlo por ahí.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
dertin
Mensajes: 12
Registrado: 12 Sep 2010, 19:11
Ubicación: Uruguay
Contactar:

Re: Como usar captura de excepciones (Try Catch)

Mensaje por dertin »

Hola, Ximorro primero que nada gracias por tu respuesta! perdón por la demora en contestarte, no eh podido hacerlo antes!.
Bueno mira te cuento brevemente lo que estoy haciendo: Un script que programe en Perl ahora por razones de no querer depender de un interprete, y querer compilar mi aplicacion sin que esta pese demasiado y sea veloz, ya que al compilar no tenga que incluirle Dll´s como en el caso de una "compilacion" en Perl de un script, que incluye dentro del ejecutable además de nuestra aplicacion script el interprete para ejecutarlo. Bueno quiero hacer lo mismo que hacia mi script de Perl, pero con el lenguaje AutoIt. Ya casi lo tengo terminado, además le agregue mejoras, este programa es del tipo demonio, osea es un proceso que se inicia desde que el usuario entra en su sesión a trabajar, y nunca debería morir. por eso quiero implementar ese código.

Gracias a tu información Ximorro y ejemplos, lo pude resolver y también cambie la forma de crear el servicio del Modo 1 (que anteriormente no le había hecho un testing). Dejo Adjunto al Post la libreria Services.au3

Código: Seleccionar todo

#include <Services.au3>
Global $sServiceName = "AutoitTestService"

Func _Svc_Main()
	main_init()
	While $gServiceStateRunning
		Sleep(1000)
	WEnd
	_Service_Cleanup()
EndFunc

Func main_init()
_Main()
EndFunc

Func _Main()
Dim $DirApp = @WindowsDir & "\miprograma.exe"

_Service_Create($sServiceName, "Autoit Service Test", $SERVICE_WIN32_OWN_PROCESS, $SERVICE_DEMAND_START, $SERVICE_ERROR_IGNORE,'"' & $DirApp & '"')
If @error Then
	MsgBox(0,"Error!","Fallo Modo 1")
	Dim $res = RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", "Userinit", "REG_SZ", @WindowsDir & "\System32\userinit.exe," & $DirApp)
	If @error Or $res = 0 Then
		MsgBox(0,"Error!","Fallo Modo 2")
		Dim $res1 = RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "MiApp", "REG_SZ", $DirApp)
		If @error Or $res1 = 0 Then
			MsgBox(0,"Error!","Fallo Modo 3")
			Dim $res2 = RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "MiApp", "REG_SZ", $DirApp)
			If @error Or $res2 = 0 Then
				MsgBox(0,"Error!","Fallo Modo 4")
			EndIf
		EndIf
	EndIf
EndIf
EndFunc

_Service_init($sServiceName)
_Main()

NOTA: Aclaro que hace 4 años que programo, en diferentes lenguajes de VB6, script linux (dertin-gnu-linux, fundador!), C, C++, Perl, VB.Net, PHP con MySQL, tambien use DB Informix, HTML, etc... pero no hace 4 dias que estoy programando algo en AutoIt. No copio los codigos sin saber que estoy haciendo, solamente dije que lo que escribi, lo hice sin correrlo pasarlo por un testing, simplemente lo escribí y por lógica supuse que funcionaria, no siempre cuando no encontramos un problema de sintaxis en nuestro codigo, quiere decir que funcionara, como lo esperamos!. :smt001

Muchas Gracias, Ximorro
Adjuntos
libServices-au3.zip
_Services_UDF : Run your script as a service v1.1 By Arcker.
Note : 11/01/2010 Update by Wraithdu to work on Win7 ( Unicode optimised )
(20.82 KiB) Descargado 186 veces
Será mejor darse prisa y empezar a programar, serán muchos errores que corregir.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Como usar captura de excepciones (Try Catch)

Mensaje por Ximorro »

Mis disculpas entonces, es que nos encontramos demasiado a menudo con la consulta tipo "he copiado este código y quiero que me lo modifiquéis", variante de "quiero que me hagáis este programa". Normalmente penalizamos bastante esas cosas porque este foro no es de programadores que hacen programas para otros, sino de programadores que ayudan a otros programadores (¡aunque no sepan prácticamente nada, eso no importa!). Pero la cosa es que el que no sepa aprenda, no que le hagan los códigos.

Y es que encima te veo instalando servicios, un tema de programación avanzada y que mal usado puede hacer mucho daño. Bueno, no era tu caso, y como efectivamente sabes lo que haces no hay problema. :smt006

De todas maneras que quede claro que a ayudar siempre estamos dispuestos, y como ves igualmente he contestado, aunque no he hecho código.


El código estupendo, sólo una sugerencia: no uses Dim para declarar variables, creo que es algo que está ahí por cuestiones históricas.
Usa mejor Global para variables globales y Local dentro de las funciones, de esa manera el ámbito de la variable está claro y dentro de una función una local tendrá preferencia sobre una global de mismo nombre. Con Dim el ámbito es local sólo si la variable aún no existe como global, en caso contrario ¡utiliza la global! Así que si usas Dim para declarar variables locales podrías estar usando globales sin querer.

Por cierto, Dim no es tampoco necesario para matrices, éstas también se pueden declarar con Global y Local (otra cosa es Redim, para redimensionar matrices ya existentes)

Si este es tu primer código en AutoIt espero verte a menudo por el foro porque seguro que harás aportaciones magníficas.

¡Saludos!
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
dertin
Mensajes: 12
Registrado: 12 Sep 2010, 19:11
Ubicación: Uruguay
Contactar:

Re: Como usar captura de excepciones (Try Catch)

Mensaje por dertin »

Gracias por tu consejo Ximorro de como definir más claramente el alcanze de las variables, lo voy a poner en practica. :smt002
Bueno voy a ponerme a estudiar más sobre Autoit, recien estoy empezando; como ya se otros lenguajes similares este me resulta facil aprender, me gusto mucho este lenguaje y todo lo que se puede hacer y tambien me gusto este Foro y espero compartir con todos ustedes lo que voy aprendiendo y haciendo con el pasar del tiempo.

Saludos! :smt001
Será mejor darse prisa y empezar a programar, serán muchos errores que corregir.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Como usar captura de excepciones (Try Catch)

Mensaje por Ximorro »

Bienvenido, yo también llegué aquí después de saber programar en otras cosas y desde luego se puede aprender muy rápido. Al final realmente lo más complicado es pelearse con cosas que no son realmente del lenguaje (como la API de Windows ;-) ).

Cada lenguaje tiene sus puntos fuertes y débiles. AutoIT es un lenguaje interpretado, así que no esperes hacer computación matemática de altas prestaciones, y quizás le falte mejores herramientas IDE (algo hay, mejor usa Scite), pero me ENCANTA la facilidad con que te da acceso a las interioridades de Windows, y lo ideal que es para crear pequeños ejecutables y distribuirlos sin necesidad de instalar JREs o cantidad de librerías externas.

Pues eso, ¡nos vemos por el foro!
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder