Try ... catch e - problem Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

effel
Posts: 51
Joined: 16 Jan 2018, 13:34

Try ... catch e - problem

04 Mar 2018, 16:46

hallo ahk gemeinde,
folgender code funktioniert bei mir einwandfrei, bis auf, wenn ich keine internetverbindung habe, dann kommt leider eine fehlermeldung.
ich habe den teil, der für das versenden der mail zuständig ist, wie ich es in einer anderen anfrage
https://autohotkey.com/boards/viewtopic ... 21#p201121
gelernt habe

Code: Select all

Try {
......
}
catch e {
.....
}
eingepasst. aber irgendwo habe ich wohl doch einen fehler drin. ich sehe nicht mal die msgbox, welche das fehlen der internetverbindung anzeigen soll.


Code: Select all

; power director starten, aufnahmemodus initialisieren, fenster minimieren und aufnahme starten

#Persistent ;sorgt dafür, dass sich das Programm nicht beendet

;preSettings
restsizeAlarm = 02:30: ; zeit für alarm am pc und per email
alarmEmail = on

; /*
;alle PowerDirector Prozesse schliessen
; +++++++++++++++++++++++++++++++++++++++++++
Process, Exist, CES_AudioCacheAgent.exe
PID := Errorlevel
Process, Close, %PID%
Process, Exist, PDR11.exe
PID := Errorlevel
Process, Close, %PID%
Process, Exist, UACAgent.exe
PID := Errorlevel
Process, Close, %PID%
Process, Exist, CES_CacheAgent.exe
PID := Errorlevel
Process, Close, %PID%
Process, Exist, CES_IPCAgent.exe
PID := Errorlevel
Process, Close, %PID%
Process, Exist, MotionMenuGenerator.exe
PID := Errorlevel
Process, Close, %PID%
Process, Exist, PDHanumanSvr.exe
PID := Errorlevel
Process, Close, %PID%
sleep, 5000
; +++++++++++++++++++++++++++++++++++++++++++
; */

PowerDirectorPfad := "C:\Program Files\CyberLink\PowerDirector11\PDR11.exe"
run, %PowerDirectorPfad%
sleep, 15000 ; 15 sekunden warten bis PD gestartet ist
Control, Check,, AfxWnd90u7, ahk_class VIDEOEDITOR ; aufzeichnungsmodus aktivieren
sleep, 20000 ; 20 sekunden warten
Control, Check,, AfxWnd90u41, ahk_class VIDEOEDITOR ; fenster minimieren
sleep, 1000
SetTimer, restSize, 10000
goto start
return

start:
Control, Check,, AfxWnd90u15, ahk_class VIDEOEDITOR ;aufnahme start
Sleep, 7169000 ; zwei stunden aufnahme 31 sekunden sleep abgerechnet
soundbeep, 2000
sleep, 1000
Control, Check,, AfxWnd90u15, ahk_class VIDEOEDITOR ;aufnahme stop
sleep, 30000 ; 30 sekunden warten
goto start

#t:: ;win + t
if tooltip_info_anzahl > 0 
{
    tooltip_info_anzahl += 1
    return
        }
tooltip_info_anzahl = 1
SetTimer, TasteTooltipToogle, -800 
return

TasteTooltipToogle:
if tooltip_info_anzahl = 1
{
    SetTimer, Schleife2, off
    SetTimer, Schleife1, 300
        }
else if tooltip_info_anzahl = 2
{
    SetTimer, Schleife1, off
    SetTimer, Schleife2, 300
        }
else if tooltip_info_anzahl > 2
{
    SetTimer, Schleife1, off
    SetTimer, Schleife2, off
    tooltip
        }
tooltip_info_anzahl = 0
return

Schleife1:
SetTimer, Schleife2, Off  
ControlGetText, _frei_, Static10, ahk_class VIDEOEDITOR
ToolTip, %_frei_%
return

Schleife2:
SetTimer, Schleife1, Off
gosub Schleife2Daten
; MsgBox, Power Director Stats:`nAufgenommen: %_aufgenommen_%`nFrei: %_frei_%`nBenutzt: %_benutzt_%`nÜbersprungen: %_uebersprungen_%`nAufgenommen: %_aufgenommen_%`nVerfügbare Länge: %_VerfuegbarerPlattenplatz_%
ToolTip, Power Director Stats:`nLaufwerk: %_laufwerk_%`nDateigrösse: %_aufgenommenGB_%`nFrei: %_frei_%`nBenutzt: %_benutzt_%`nAufgenommen: %_aufgenommen_%`nVerfügbare Restzeit: %_VerfuegbarerPlattenplatz_%`nRestzeit Alarm: %restsizeAlarm%00
; ToolTip, Power Director Stats:`nLaufwerk: %_laufwerk_%`nDateigrösse: %_aufgenommenGB_%`nFrei: %_frei_%`nBenutzt: %_benutzt_%`nÜbersprungen: %_uebersprungen_%`nAufgenommen: %_aufgenommen_%`nVerfügbare Länge: %_VerfuegbarerPlattenplatz_%
return

Schleife2Daten:
ControlGetText, _laufwerk_, Static8, ahk_class VIDEOEDITOR
ControlGetText, _aufgenommenGB_, Static9, ahk_class VIDEOEDITOR
ControlGetText, _frei_, Static10, ahk_class VIDEOEDITOR
ControlGetText, _benutzt_, Static11, ahk_class VIDEOEDITOR
ControlGetText, _uebersprungen_, Static12, ahk_class VIDEOEDITOR
ControlGetText, _Aufgenommen_, Static13, ahk_class VIDEOEDITOR
ControlGetText, _VerfuegbarerPlattenplatz_, Static14, ahk_class VIDEOEDITOR
return

restSize:
ControlGetText, _LWrestSize_, Static8, ahk_class VIDEOEDITOR
stringreplace, _LWrestSize_, _LWrestSize_, :\, %A_Space%, ALL
ControlGetText, _restSize_, Static14, ahk_class VIDEOEDITOR
if _restSize_ contains %restsizeAlarm%
SetTimer, restSizeAlarm, 20000
return

restSizeAlarm:
SetTimer, restSize, off
soundbeep, 2000, 2000
sleep, 1000
ComObjCreate("SAPI.SpVoice").Speak("achtung festplatte " . _LWrestSize_ . " bald voll")
gosub alarmEmail
return

alarmEmail:
if alarmEmail = on
{
gosub Schleife2Daten
Schleife2Daten_ = achtung festplatte bald voll`n`nPower Director Stats:`nLaufwerk: %_laufwerk_%`nDateigrösse: %_aufgenommenGB_%`nFrei: %_frei_%`nBenutzt: %_benutzt_%`nAufgenommen: %_aufgenommen_%`nVerfügbare Restzeit: %_VerfuegbarerPlattenplatz_%`nRestzeit Alarm: %restsizeAlarm%00
SendGmail(Schleife2Daten_,"deineGmailAdresse@gmail.com")
alarmEmail = off
}
return

#s:: ;win + s
Control, Check,, AfxWnd90u15, ahk_class VIDEOEDITOR ;aufnahme stop
tooltip
return

Try {
SendGmail(message,emailto){	
	pmsg := ComObjCreate("CDO.Message")
	pmsg.From := """Power Director Alarm"" <deineGmailAdresse@gmail.com>"
	pmsg.To := emailto
	pmsg.Subject := "Power Director Alarm"
	pmsg.TextBody := message
	
	fields := Object()
	fields.smtpserver := "smtp.gmail.com"
	fields.smtpserverport := 465
	fields.smtpusessl := True
	fields.sendusing := 2
	fields.smtpauthenticate := 1
	fields.sendusername := "deineGmailAdresse@gmail.com"
	fields.sendpassword := "DeinMailPasswort"
	fields.smtpconnectiontimeout := 60
	
	schema := "http://schemas.microsoft.com/cdo/configuration/"
	pfld := pmsg.Configuration.Fields
	For field,value in fields
		pfld.Item(schema . field) := value
	pfld.Update()
	pmsg.Send()
	pmg.Close
}
return
}
catch e {
soundbeep, 2000
msgbox, 0, Fehler, Keine Internetverbindung, 5
alarmEmail = on
Return
}

weil wohl nicht jeder den power director auf seinem rechner hat, habe ich die unwesentlichen teile gelöscht. dabei kommt dann folgender code heraus,

ich hoffe es ist so übersichtlich. folgender code funktioniert

nur wenn ich die verbindung zum internet trenne, kommt eine fehlermeldung

Code: Select all

#Persistent ;sorgt dafür, dass sich das Programm nicht beendet

alarmEmail = on

SetTimer, restSize, 10000
return

restSize:
tooltip, restSize on
sleep, 1000
SetTimer, restSizeAlarm, 10000
return

restSizeAlarm:
SetTimer, restSize, off
tooltip, restSize off
soundbeep, 2000, 2000
sleep, 1000
ComObjCreate("SAPI.SpVoice").Speak("achtung festplatte bald voll")
gosub alarmEmail
return

alarmEmail:
if alarmEmail = on
{
SendGmail("test","DeineMailAdresse@gmail.com")
alarmEmail = off
}
return


Try {
SendGmail(message,emailto){	
	pmsg := ComObjCreate("CDO.Message")
	pmsg.From := """Power Director Alarm"" <DeineMailAdresse@gmail.com>"
	pmsg.To := emailto
	pmsg.Subject := "Power Director Alarm"
	pmsg.TextBody := message
	
	fields := Object()
	fields.smtpserver := "smtp.gmail.com"
	fields.smtpserverport := 465
	fields.smtpusessl := True
	fields.sendusing := 2
	fields.smtpauthenticate := 1
	fields.sendusername := "DeineMailAdresse@gmail.com"
	fields.sendpassword := "DeinPasswort"
	fields.smtpconnectiontimeout := 60
	
	schema := "http://schemas.microsoft.com/cdo/configuration/"
	pfld := pmsg.Configuration.Fields
	For field,value in fields
		pfld.Item(schema . field) := value
	pfld.Update()
	pmsg.Send()
	pmg.Close
}
}
catch e {
soundbeep, 2000, 2000
msgbox, 0, Fehler, Keine Internetverbindung, 5
alarmEmail = on
Return
}
User avatar
divanebaba
Posts: 744
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Try ... catch e - problem

04 Mar 2018, 18:17

Hallo.
Ob eine Verbindung vorliegt, prüfe ich mit folgender Funktion:

Code: Select all

If ConnectedToInternet()
	Msgbox Verbindung besteht
else
	MsgBox Keine Verbindung
return

ConnectedToInternet(flag=0x40) {
Return DllCall("Wininet.dll\InternetGetConnectedState", "Str", flag,"Int",0)
}
Jetzt musst Du nur noch vor jedem Internetzugang ein If ConnectedToInternet() vorsetzen, dann ersparst Du Dir die Fehlermeldung, bzw. einen zum Scheitern verurteilten Zugriff auf das Internet.

Dein Try & Catch-Abschnitt im letzten Codebeispiel sollte, meiner Auffassung nach, niemals ausgeführt werden. Bist Du Dir sicher, auch nicht zuviel vom Originalcode weggelassen zu haben?
Der Übersichtlichkeit halber sollte man Code, der mit der AutoExecute-Sektion ausgeführt wird, möglichst oben platzieren. Dann erkennt man solche Abschnitte einfach besser.
[Starklichtbirne IQ >> 250!!] Dank deutscher Lehrerempfehlung, nur Süperdepp und Hartz4-Bezieher, statt Abitürient und Einkommensbezieher.
[Strong light bulb IQ >> 250!!] Thanks to german teacher's recommendation, willful and welfare recipient, instead of high school graduate and moneymaker.

Entering high school for foreign children is not prohibited in GERMANY, it's only made nearly impossible by government.
Virtually the only way - visiting high school abroad.

ADVERTISING: Patent pending strip accumulator - süper advanced technology - priceless inexpensive, space-saving, energy efficient - Patent priority for sale.
User avatar
gregster
Posts: 1484
Joined: 30 Sep 2013, 06:48

Re: Try ... catch e - problem

04 Mar 2018, 18:43

Yo, wenn du try (und catch) mit einer Funktionsdefinition verwendest, dann musst du es in die Funktion reinnehmen, anstatt zu versuchen, die Funktion darin einzuhüllen. Das was du im Moment machst, würd auch nicht funktionieren, wenn es in der autoexecute section stehen würde, bin ich überzeugt.
Last edited by gregster on 04 Mar 2018, 18:49, edited 1 time in total.
effel
Posts: 51
Joined: 16 Jan 2018, 13:34

Re: Try ... catch e - problem

04 Mar 2018, 18:48

@divanebaba danke für deine antwort, aber mein rechner ist mit einem router verbunden, der router bekommt sein internet von einem hotspot handy.

wenn ich die verbindung zum router bestehen lasse, jedoch das handy ausschalte, bekomme ich mit deinem code eine positive antwort, obwohl keine internetverbindung besteht

@gregster auch dir danke ich, aber ich verstehe nur bahnhof...
in einem anderen beispiel habe ich es im prinzip genau so gemacht, das läuft fehlerfrei

Code: Select all

Try {
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "https://www.google.com", true)
whr.Send()
whr.WaitForResponse()
needle := whr.ResponseText
fileappend, %needle%, google.html
}
catch e {
fileappend, %TimeStamp%`n, ____fehler.txt
soundbeep, 2000
msgbox, 0, Fehler, Keine Internetverbindung, 5
}
hier wird eine google.html auf meiner platte gespeichert, wenn ich die verbindung zum netz trenne, kommt die msgbox mit dem hinweis, das ich keine verbindung habe.

dachte das kann ich auch mit dem emailcode so machen
User avatar
divanebaba
Posts: 744
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Try ... catch e - problem

04 Mar 2018, 19:25

Hmm.
Sowas ähnliches sagte auch Masonjar13, aber ich habe ihn nicht richtig verstanden. Immerhin hat er mir einen Link gelassen, der angeblich funktionieren soll.
Versuche mal hiermit etwas anzufangen.
[Starklichtbirne IQ >> 250!!] Dank deutscher Lehrerempfehlung, nur Süperdepp und Hartz4-Bezieher, statt Abitürient und Einkommensbezieher.
[Strong light bulb IQ >> 250!!] Thanks to german teacher's recommendation, willful and welfare recipient, instead of high school graduate and moneymaker.

Entering high school for foreign children is not prohibited in GERMANY, it's only made nearly impossible by government.
Virtually the only way - visiting high school abroad.

ADVERTISING: Patent pending strip accumulator - süper advanced technology - priceless inexpensive, space-saving, energy efficient - Patent priority for sale.
User avatar
gregster
Posts: 1484
Joined: 30 Sep 2013, 06:48

Re: Try ... catch e - problem

04 Mar 2018, 19:53

effel wrote:@gregster auch dir danke ich, aber ich verstehe nur bahnhof...
in einem anderen beispiel habe ich es im prinzip genau so gemacht, das läuft fehlerfrei

Code: Select all

Try {
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "https://www.google.com", true)
whr.Send()
whr.WaitForResponse()
needle := whr.ResponseText
fileappend, %needle%, google.html
}
catch e {
fileappend, %TimeStamp%`n, ____fehler.txt
soundbeep, 2000
msgbox, 0, Fehler, Keine Internetverbindung, 5
}
Nein, der Unterschied ist, hier rufst du eine Funktion (nämlich ComObjCreate) auf mit einem bestimmten Parameter (hier: "WinHttp.WinHttpRequest.5.1") - also es wird versucht, die Funktion ordnungsgemäß aufzurufen und ein Fehler würde ggf. abgefangen.
In deinem Skript weiter oben rufst du die Funktion SendGmail(message,emailto) aber nicht auf, als du Try verwendest - sondern definierst sie (und in dem Moment wird die Funktion nicht ausgeführt und bei deinen tatsächlichen Funktionsaufrufen wird das try auch nicht angesprungen/durchlaufen, da es außerhalb der Funktion steht.). Also nicht:

Code: Select all

try
{
	NeFunktion(text)
	{ 	
		msgbox %text%
	}
	return
}
sondern:

Code: Select all

NeFunktion(text)
{ 	
	try
	{
		msgbox %text%
	}
	; catch ...
	return
}
Dann kommt das try zum Tragen, wenn die Funktion gerufen und tatsächlich durchlaufen wird.
Oder eben beim Funktionsaufruf:

Code: Select all

try
	NeFunktion("DasisteinParameter")
Das wäre dann das gleiche Verfahren wie bei ComObjCreateWobei du innerhalb des eigentlichen Funktioncodes die Fehlerbehandlung ggf. noch stärker differenzieren könntest als beim simplen Funktionsaufruf. Bei letzterem wird eher das Gesamtergebnis des Aufrufs betrachtet.

Das ist im Prinzip dasselbe wie bei if und else - die würdest du ja bei der Definition der Funktion auch in den Funktionscode schreiben und nicht drumherum.
effel
Posts: 51
Joined: 16 Jan 2018, 13:34

Re: Try ... catch e - problem  Topic is solved

05 Mar 2018, 08:33

@gregster
meinst du das so? oder funktioniert es nur zufällig?
danke das ist klasse, habe das mit der funktion nie verstanden, bis jetzt wo ich sie auseinander genommen habe :D :D

so gehts auf jeden fall:

Code: Select all

message := "text der nachricht"
gosub SendGmail
return

SendGmail:
Try{	
	pmsg := ComObjCreate("CDO.Message")
	pmsg.From := """mail"" <mail@gmail.com>"
	pmsg.To := """mail"" <mail@gmail.com>"
	pmsg.Subject := "test"
	pmsg.TextBody := message
	
	fields := Object()
	fields.smtpserver := "smtp.gmail.com"
	fields.smtpserverport := 465
	fields.smtpusessl := True
	fields.sendusing := 2
	fields.smtpauthenticate := 1
	fields.sendusername := "mail@gmail.com"
	fields.sendpassword := "passwort"
	fields.smtpconnectiontimeout := 60
	
	schema := "http://schemas.microsoft.com/cdo/configuration/"
	pfld := pmsg.Configuration.Fields
	For field,value in fields
		pfld.Item(schema . field) := value
	pfld.Update()
	pmsg.Send()
	pmg.Close
}
catch e {
soundbeep, 2000, 2000
msgbox, 0, Fehler, Keine Internetverbindung, 5
Return
}
User avatar
gregster
Posts: 1484
Joined: 30 Sep 2013, 06:48

Re: Try ... catch e - problem

05 Mar 2018, 08:41

Ja, hier nutzt du gosub, um zu einer Subroutine zu springen - das ist so ähnlich wie ein Funktionsaufruf (Funktionen haben allerdings standardmäßig lokale Variablen). Und korrekterweise verwendest du Try innerhalb der Subroutine und schreibst nicht

Code: Select all

Try 
{
	SendGmail:
Dann wäre try nutzlos, da es nicht durchlaufen würde - gosub springt nämlich direkt zum Label SendGmail, und nicht zum Try, das im "Niemandsland" steht. Das wäre dann derselbe Fehler, denn du oben mit der Funktion gemacht hast.
User avatar
gregster
Posts: 1484
Joined: 30 Sep 2013, 06:48

Re: Try ... catch e - problem

05 Mar 2018, 08:50

Aber das gleiche kannst du mit einer Funktion machen - und das ist, was ich eigentlich meinte

Code: Select all

SendGmail(message,emailto){
  Try 
  {	
	pmsg := ComObjCreate("CDO.Message")
	pmsg.From := """Power Director Alarm"" <deineGmailAdresse@gmail.com>"
	pmsg.To := emailto
	pmsg.Subject := "Power Director Alarm"
	pmsg.TextBody := message
	
	fields := Object()
	fields.smtpserver := "smtp.gmail.com"
	fields.smtpserverport := 465
	fields.smtpusessl := True
	fields.sendusing := 2
	fields.smtpauthenticate := 1
	fields.sendusername := "deineGmailAdresse@gmail.com"
	fields.sendpassword := "DeinMailPasswort"
	fields.smtpconnectiontimeout := 60
	
	schema := "http://schemas.microsoft.com/cdo/configuration/"
	pfld := pmsg.Configuration.Fields
	For field,value in fields
		pfld.Item(schema . field) := value
	pfld.Update()
	pmsg.Send()
	pmg.Close
	Return
  }
  catch e 
  {
	soundbeep, 2000, 2000
	msgbox, 0, Fehler, Keine Internetverbindung, 5
	Return
  }	
}
Not tested ;)
effel
Posts: 51
Joined: 16 Jan 2018, 13:34

Re: Try ... catch e - problem

05 Mar 2018, 09:09

das ist noch besser für meinen zweck und funktioniert

cool, danke dir, habe heute viel gelernt :-)

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Google [Bot] and 12 guests