tester123 Posted August 28, 2013 Share Posted August 28, 2013 Hi, I'm not sure if this comes under "exception handling" but results when I searched for exception handling were a whole lot different, so i thought I'll start a new thread. I have 50+ scripts and I would like to run them in sequence. Lets assume I use a shell script to run them. Assuming script 25 fails. (By fail, i mean a condition where some control has changed and the script cannot find a certain element and so the script just gets stuck), how do I get script 25 to gracefully exit and let script 26 run? Or as an alternative, can i have a global time out which tells AutoIt,wait for a maximum of 2 minutes before giving up? Any help is much appreciated! Link to comment Share on other sites More sharing options...
FireFox Posted August 28, 2013 Share Posted August 28, 2013 Hi, You can check if the function succeeds or not by checking its return value or the error/extended macros. Then it's up to you to do the rest. Br, FireFox. Link to comment Share on other sites More sharing options...
tester123 Posted August 28, 2013 Author Share Posted August 28, 2013 Hey FireFox, Thank you for your reply! Yeah, thats one possibility, but each script has 100s of code with numerous functions and to check each one could be time consuming. But well, if there is no other option then I was hoping for a more global option that can be set. (like WinWaitDelay). Btw, I was wondering why does the script freeze when it is unable to perform an operation - say if a button is not present and the script tries to click it. Can it throw an exception saying "hey no button found". Any ideas as to making a global change? Link to comment Share on other sites More sharing options...
JohnOne Posted August 28, 2013 Share Posted August 28, 2013 It's up to you (coder) to error check your scripts. AutoIt cannot know what you consider a failure. Firefox answer is correct. AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans. Link to comment Share on other sites More sharing options...
Solution kylomas Posted August 29, 2013 Solution Share Posted August 29, 2013 (edited) tester123, Not sure what you mean by "gracefully". If you just want to cancel the script based on a timeout and run the next script then the following might be useful to you. The script sets up a test envorinment: @scriptdirtest scripts*.au3 Several scripts that will run for varying lengths of time. One of the scripts is setup to exceed the 120 second timeout limit. @scriptdirtest scriptsrun_log.txt Logging mechanism used for testing. The driver (shell) portion of the script works off a timer and the PID. Scripts are run using "autoit3.exe scriptname". The scriptnames are fed to the driver from the array created at the top of the script. You may be able to use this as a model to set something up for your environment. expandcollapse popup#include <array.au3> #include <date.au3> ; Hammer and Tongues Method ;---------------------------------------------------------------------------------------------------------------------------------- ; ; Create Test Environment ; ;---------------------------------------------------------------------------------------------------------------------------------- local $aScripts[50] = ['Script1.au3', _ 'Script2.au3', _ 'Script3.au3', _ 'Script4.au3', _ 'Script5.au3', _ 'Script6.au3', _ 'Script7.au3', _ 'Script8.au3', _ 'Script9.au3', _ 'Script10.au3', _ 'Script11.au3', _ 'Script With Timeout Problem.au3', _ 'Script21.au3', _ 'Script22.au3', _ 'Script23.au3', _ 'Script24.au3', _ 'Script25.au3', _ 'Script26.au3', _ 'Script27.au3', _ 'Script28.au3', _ 'Script29.au3'] local $ret = 0, $test_path = '\Script Test' if fileexists(@scriptdir & $test_path) then filedelete(@scriptdir & $test_path) $ret = DirCreate(@scriptdir & $test_path) if $ret <> 1 then ConsoleWrite('DirCreate for test script directory failed...exiting...' & @LF) Exit endif local $str = '' l('Generating Scripts') for $1 = 0 to ubound($aScripts) - 1 if $aScripts[$1] = '' then exitloop $str = '#include <date.au3>' & @lf if $aScripts[$1] = 'Script With Timeout Problem.au3' then $str &= 'sleep(999999)' & @lf else $str &= 'local $sleep_time = random(1,10,1) * 1000' & @lf $str &= 'l("Script = " & @scriptname & " running for " & $sleep_time/1000 & " seconds")' & @lf $str &= 'sleep($sleep_time)' & @lf endif $str &= 'func l($str)' & @lf $str &= ' local $hfl = fileopen(@scriptdir & "\run_log.txt",1)' & @lf $str &= ' filewrite($hfl,stringformat("%-20s %-100s",_now(),$str) & @lf)' & @lf $str &= ' fileclose($hfl)' & @lf $str &= ' $hfl = 0' & @lf $str &= 'endfunc' & @lf $ret= filewrite(@scriptdir & $test_path & '\' & $aScripts[$1],$str) if $ret <> 1 then ConsoleWrite('File write for script = ' & @scriptdir & $test_path & '\' & $aScripts[$1] & @LF) Exit endif next func l($str) local $hfl = fileopen(@scriptdir & $test_path & '\run_log.txt',1) ; append filewrite($hfl,stringformat('%-20s %-100s',_now(),$str) & @lf) fileclose($hfl) $hfl = 0 endfunc ;---------------------------------------------------------------------------------------------------------------------------------- ; ; Driver Script to run test scripts in order with a timeout value. ; ;---------------------------------------------------------------------------------------------------------------------------------- local $timeout = 120 ; seconds local $st, $pid l('Start Driver Script. Options:') l(@tab & 'Timeout Value = ' & $timeout) for $1 = 0 to ubound($aScripts) - 1 if $aScripts[$1] = '' then exitloop l('') l('Starting script = ' & $aScripts[$1]) $pid = run('autoit3.exe ' & @scriptdir & '"' & $test_path & '"' & '\' & '"' & $aScripts[$1] & '"') ConsoleWrite($pid & @LF) $st = timerinit() while int(timerdiff($st)/1000) < 120 sleep(250) if not processexists($pid) then exitloop WEnd if not processexists($pid) then l('Script ' & $aScripts[$1] & ' ended normally') Else l('Cancelling script = ' & $aScripts[$1] & ' due to timeout') processclose($pid) EndIf next As to why your scripts might freeze. As suggested, you need to interogate return codes for all functions. Whenever you are doing something to a window you first need to verify it's presence and state. I don't know of any global value that can be set to indicate "my script is fucking up". The driver script above has no idea what the driven script is doing, only that it has exceeded a timeout value and the process id still exists. Good Luck, kylomas Edited August 29, 2013 by kylomas Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
tester123 Posted August 29, 2013 Author Share Posted August 29, 2013 Kylomas, Thats exactly one of the two options I was looking for! Thank You. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now