Is it truly and Integer variable in AutoHotkey?

I was working on my Excel Function library and ran into a snag.  Maestrith helped me figure it out however I’m still not loving that I can’t trust “is Integer”.  make sure you add something to your variable (even zero) to force it to be numeric!

AutoHotkey Webinar-When, Why and How to use Error Checking on Runtime Errors

When, Why and How to use Error Checking on Runtime Errors

Video Hour 1: High-level overview: Hour 1
Video Hour 2: Q&A: Hour 2

Script Highlight: Detecting Carrier type, location, company from a phone number.

When / Why to use Error Checking

For general troubleshooting of your own code use:

  1. Msgbox
  2. Debug in SciTE , AHK Studio or Notepad++
  3. Watch this Webinar on Debugging & Troubleshooting

Runtime Errors– An error that occurs during the execution of a program

  1. Use Error Handling to diagnose Runtime Errors for scripts distributed to clients
  2. Allows you to adapt the reported error as something meaningful to non-coders
  3. Frequently provides information you cannot get elsewhere
  4. Easy to Log the error with additional information so we can have context of what is frequently going wrong  (Users are typically terrible are providing enough information)
  5. Can prevent the script from “locking up” / throwing an Error that is confusing to the client
  6. Build-into your Class / Library to help others utilizing your code

ErrorLevel and OnError

ErrorLevel

  • Built-in variable which indicates success/failure of many (84) commands
  • A value of Zero means success. Most commands return a 1 for failure but some have values higher than 1

OnError

  • Specifies a function to run automatically when an unhandled error occurs.

OnExit

  • A Built-in Function name/Object to call when your script is exiting
  • It can help understand why/when your script exited

There are 84 Built-in Command/Functions with Error Level

#SingleInstance,Force
;********************Input box***********************************
If (0){
	InputBox,Var,Name gathering,Enter your name,,,,,,,6
	if (ErrorLevel=1)
		MsgBox,,InputBox Example, % "error Level:"  ErrorLevel ": Cancel was hit",13
	if (ErrorLevel=2)
		MsgBox,,InputBox Example, % "error Level:"  ErrorLevel ": Timed out",13
}

;**********Jean Lalonde Tip: Save Errorlevel 1st as something else can quickly overwrite it!***********************
If (0){
	InputBox,Var,Jean Tip: Name gathering,Enter your name,,,,,,,3
	Err := ErrorLevel
	if (Err=1)
		MsgBox,,Jean Tip Example, % "error Level:"  Err ": Cancel was hit",3
	if (Err=2)
		MsgBox,,Jean Tip Example, % "error Level:"  Err ": Timed out",3
}

;********************ClipWait***********************************
If (0){
	Clipboard:=""
	ClipWait,1 ;Wait 1 second for Clipboard to have data
	if (ErrorLevel=1){
		MsgBox  ,, ClipWait example, % "error Level:" ErrorLevel "  : Nothing entered",3
		return
	}
}

;******On Error   https://autohotkey.com/docs/commands/OnError.htm ***********
If (1){
	OnError("LogError") ;Put name of function here in quotes.  The function is given the exception OBJECT as a parameter
	%cause% := error
	MsgBox Hello world ;Note, because of error, this is not reached
}

;********************LogError function***********************************
LogError(exception) {
	FileAppend % "Error on line " exception.Line ": " exception.Message "`n", errorlog.txt
	Sleep, 100
	FileRead, Error_Log,errorlog.txt
	DebugWindow(Error_Log,1) ;Shove into Debug window below
	return true
}

Try / Catch / Throw / Finally / Exception

  • Try– Will “try” to execute a given line(s) of code
  • Catch– Specifies the code to execute if an exception is raised during execution of a Try statement.
  • Throw– Signals the existence of an error allowing a Try/Catch command to display info about this error. This object allows you to personalize the message / information available
  • Finally– Used in conjunction with Try or Catch. Ensures that one or more statements (commands or expressions) are always executed after the execution of a try statement
  • Exception()- An Object with properties to be accessed from Catch’s OutputVar
  • Message:An error message or ErrorLevelvalue.
  • What:The name of the command, function or label which was executing or about to execute when the error occurred.
  • Extra:Additional information about the error, if available.
  • File:Set automatically to the full path of the script file which contains the line at which the error occurred.
  • Line:Set automatically to the line number at which the error occurred.
#SingleInstance,Force
;**********Example 1****************************
If (0){
	try {  ; Attempts to execute code.
		HelloWorld()
		MakeToast()
	}catch e { ; Handles the first error/exception raised by the block above.
		MsgBox, An exception was thrown!`nSpecifically: %e%
	}
}
HelloWorld()  { ; Always succeeds.
	MsgBox, Hello, world!
}

MakeToast()  { ; Always fails.
	throw A_ThisFunc " is not implemented, sorry"  ; Jump immediately to the try block's error handler:
}

;**********Example_2*********************************************
If (0){
	try{
		obj := ComObjCreate("ScriptControl")
		obj.ExecuteStatement("MsgBox ""This is embedded VBScript""")
		;~ obj.InvalidMethod() ; This line produces a runtime error.
	} catch e {
		MsgBox, 16,, % "Exception thrown!`n`nwhat: " e.what ;Note the e is an object
			. "`nfile: " e.file
			. "`nline: " e.line
			. "`nmessage: " e.message
			. "`nextra: " e.extra ; For more detail about the object that e contains, see Exception().
	}
}

;********************Example_3***********************************
If (0){
	try	SomeFunction()
	catch e
		MsgBox % "Error in " e.What ", which was called at line " e.Line " and message " e.message
	
	SomeFunction() {
		throw Exception("this really sucked", -1)
	}
}

;********************Example_4* Disregarding Errors**********************************
If (0){
	ComObjError(1) ;This is optional but not recommended
	pwb:=WBGet()
	doo:=pwb.getElementsByTagName("doo").item[0].outerhtml
	dah:=pwb.getElementsByTagName("dah").item[0].outerhtml	
	dah:=pwb.getElementsByTagName("fda").item[0].outerhtml	
	dah:=pwb.getElementsByTagName("dfh").item[0].outerhtml	
}

 

Best Practices / Tips & Tricks

  1. Remember –in Try / Catch  the Exception thrown is an object.
  2. Not all programs accurately report ErrorLevel when run from RunWait
    1. –If this is the case, think of other ways to determine if your script finished correctly
  3. Unless you truly have a need, don’t worry about Throw or Finally.  Most developers do not use them
  4. While typically used as pairs, Try can be used without Catch
    1. — in this case, it is used only to bypass the error message
  5. ComObjError()–  can be set to 0 to disable COM errors (but isn’t recommended)
  6. Copy the ErrorLevel value to your own variable immediately  after the command that  caused the error (before its content is changed after executing another command)

 

Web Scraping with AutoHotkey 101.5-Returning InnerTEXT, Value, OuterHTML

Web Scraping with AutoHotkeyAutoHotkey Merchandise-White Stress ballThis is a quick review of getting text from a page using Web Scraping with AutoHotkey.   Often people new to Web Scraping will get hung-up on a minor detail wasting a lot of time.  This video helps point out a few of the common issues like not having a valid pointer and returning the wrong attributes.  Here is a link to the iWB2 Learner tool (remember it only works with IE.  If you’re beyond this video you might also check out this one dealing with troubleshooting.

Below is the code I review in the video

 
pwb := WBGet()
MsgBox % IsObject(pwb)
MsgBox % pwb.LocationURL
MsgBox % Var:=pwb.document.GetElementsByTagName("Input")[0].Value ;Get value
MsgBox % Var:=pwb.document.GetElementsByTagName("LI")[5].Value ;Don't use this- it doesn't pull back anything helpfu
MsgBox % Var:=pwb.document.GetElementsByTagName("LI")[5].OuterHTML ;Get InnerText
MsgBox % Var:=pwb.document.GetElementsByTagName("LI")[5].InnerHTML ;Get InnerHTML
MsgBox % Var:=pwb.document.GetElementsByTagName("LI")[5].OuterHTML ;Get OuterHTML

Web Scraping with AutoHotkey video overview- Returning the correct content

Web Scraping with AutoHotKey 105- troubleshooting web scraping

trouble shooting web scrapingTroubleshooting Web Scraping

When building my first scraping scripts I used to waste a ton of time trying to figure out what was broken.  Adding some structure to your diagnoses process can greatly speed-up detecting what has gone wrong.   A copy of the AutoHotKey syntax writer can be found here.

I think some excellent advice, not exclusive to troubleshooting web scraping, is to have a bobble-doll or something to talk to.  Pretend you’re explaining your issue to a friend and often, when you hear yourself say the words, your issue will appear to you.

This video offers some general troubleshooting tips around troubleshooting web scraping when using AutoHotKey.