Jump to content

Ascer
 Share

Recommended Posts

Hello mates.

I would like to share simple but very important function required durning code many *au3 files.

Such as function is used by a few scripts developers on forum but most of users waste a lot of time to make his functions/tool free from errors and bugs.

How is working?

This function do not check errors like Scite debugger. You can be able to make something like call exceptions in Python.

Think about this and think when you ran some code, no error but also do nothing. 0 information and you have to jump into own or other script to find out reason.

Function: Updated 2018-02-04, 08:47 (fixed AutoIt problem with dedection @ScriptName)

;==============================================================================================================================================================
; Function:         Exception ([ $sInfo = "" [, $vReturnValue = Null [, $vExtended = @extended [, $iErrorNr = @error [, $iErrorLine = @ScriptLineNumber ]]]]])
;
; Description:      Call exceptions in different *au3 files located in this same Folder.
;
; Parameter(s):     $sInfo -        Information about exception in code, created by yourself.
;                   $vReturnValue - (Default=Null) Set value to return durning exception.
;                   $iErrorNr -     (Default=@error) Set the error manually by adding a number.
;                   $vExtended -    (Default=@extended) Set extended manually.
;                   $iErrorLine -   Internal use do not change!
;
; Return Value(s):  $vReturnValue,
;                   Additional: Output string in Scite Console about debug trace.
;
; Author (s):       Who cares?
;==============================================================================================================================================================
Func Exception($sInfo="", $vReturnValue = Null, $iErrorLine = @ScriptLineNumber, $iErrorNr = @error, $vExtended = @extended)

    Dim $aArray[0]
    Local $sScriptPath = @ScriptFullPath
    Local $sCurrentScriptLine = StringLower(FileReadLine($sScriptPath, $iErrorLine))

    If Not StringInStr($sCurrentScriptLine, "exception") Then
        Local $aInclude = FileReadToArray($sScriptPath)
        For $sItem In $aInclude
            Local $sLowerLine = StringLower($sItem)
            If StringInStr($sLowerLine, "#include") Then
                Local $sIncludeName = StringTrimLeft($sItem, 8)
                Local $sConvertedName = ""
                Local $bAdd = False
                Local $aDelimeter = ["<", ">"]
                If StringInStr($sIncludeName , "'") Then
                    $aDelimeter[0] = "'"
                    $aDelimeter[1] = "'"
                ElseIf StringInStr($sIncludeName , '"') Then
                    $aDelimeter[0] = '"'
                    $aDelimeter[1] = '"'
                EndIf
                Local $aSplitInclude = StringSplit($sIncludeName, "")
                For $sSign In $aSplitInclude
                    If $sSign = $aDelimeter[0] And Not $bAdd Then
                        $bAdd = True
                        ContinueLoop
                    ElseIf $sSign = $aDelimeter[1] And $bAdd Then
                        ReDim $aArray[UBound($aArray) + 1]
                        $aArray[UBound($aArray) - 1] = $sConvertedName
                        ExitLoop
                    EndIf
                    If $bAdd Then $sConvertedName &= $sSign
                Next
            EndIf
        Next
    EndIf

    If UBound($aArray) > 0 Then
        For $sName In $aArray
            Local $sPath = @ScriptDir & "\" & $sName
            If FileExists($sPath) Then
                $sCurrentScriptLine = StringLower(FileReadLine($sPath, $iErrorLine))
                If StringInStr($sCurrentScriptLine, "exception") Then
                    $sScriptPath = $sPath
                    ExitLoop
                EndIf
            EndIf
        Next
    EndIf

    Local $aFile = FileReadToArray($sScriptPath)
    Local $sFunctionName, $sLine
    Local $bFound = False

    For $i = 0 To $iErrorLine - 1
        If $bFound Or $iErrorLine <= 0  Then ExitLoop
        $sLine = StringReplace($aFile[$iErrorLine - $i], @TAB, "")
        If StringInStr(StringLower($sLine), "func ") Then
            Local $aSortLine = StringSplit($sLine, '')
            $sLine = ""
            For $h = 1 To $aSortLine[0] - 1
                Local $sLowerSort = StringLower($aSortLine[$h])
                If $sLowerSort = "(" Then
                    $bFound = True
                    ExitLoop
                ElseIf $sLowerSort <> @TAB And $sLowerSort <> " " Then
                    If $sLowerSort = "f" Or $sLowerSort = "u" Or $sLowerSort = "n" Or $sLowerSort = "c" Then
                        $sLine &= $aSortLine[$h]
                    Else
                        If Not StringInStr($sLine, "func") Then
                            $sLine = ""
                            ExitLoop
                        Else
                            $sLine &= $aSortLine[$h]
                        EndIf
                    EndIf
                EndIf
            Next
        EndIf
    Next

    If StringLeft(StringLower($sLine), 4) <> "func" Then
        $sLine = ""
    EndIf

    $sFunctionName = StringTrimLeft($sLine, 4)

    If StringLen($sFunctionName) < 1 Then
        $sFunctionName = "not recognized"
    Else
        $sFunctionName &= " ( ... )"
    EndIf

    If StringLen($sInfo) < 1 Then
        $sInfo = "nothing about"
    EndIf

    $vRet = $vReturnValue

    If $vRet = Null Then
        $vRet = "Null"
    ElseIf IsArray($vRet) Then
        $vRet = "an Array with " & UBound($vRet) & " items"
    ElseIf IsBinary($vRet) Then
        $vRet = "binary " & $vRet
    ElseIf IsBool($vRet) Then
        $vRet = "bool " & $vRet
    ElseIf IsDllStruct($vRet) Then
        $vRet = "dll struct " & $vRet
    ElseIf IsFloat($vRet) Then
        $vRet = "float " & $vRet
    ElseIf IsHWnd($vRet) Then
        $vRet = "hwnd " & $vRet
    ElseIf IsInt($vRet) Then
        $vRet = "int " & $vRet
    ElseIf IsKeyword($vRet) Then
        $vRet = "keyword " & $vRet
    ElseIf IsNumber($vRet) Then
        $vRet = "number " & $vRet
    ElseIf IsObj($vRet) Then
        $vRet = "object " & $vRet
    ElseIf IsPtr($vRet) Then
        $vRet = "ptr " & $vRet
    ElseIf IsString($vRet) Then
        If $vReturnValue = "" or StringReplace($vRet, " ", "") = "" Then
            $vRet = 'empty string ""'
        Else
            $vRet = 'string "' & $vRet & '"'
        EndIf
    EndIf

    Local $sStruct
    $sStruct &= "! Exception = {" & @CRLF
    $sStruct &= "!" & @CRLF
    $sStruct &= "!" & @TAB & '"date" = ' & @YEAR & "-" & @MON & "-" & @MDAY & ", " & @HOUR & ":" & @MIN & ":" & @SEC & ", " & @MSEC & "ms," & @CRLF
    $sStruct &= "!" & @TAB & '"path" = ' & $sScriptPath & "," & @CRLF
    $sStruct &= "!" & @TAB & '"line" = ' & $iErrorLine & "," & @CRLF
    $sStruct &= "!" & @TAB & '"func" = ' & $sFunctionName & "," & @CRLF
    $sStruct &= "!" & @TAB & '"retn" = ' & $vRet & "," & @CRLF
    $sStruct &= "!" & @TAB & '"exten" = ' & $vExtended & "," & @CRLF
    $sStruct &= "!" & @TAB & '"error" = ' & $iErrorNr & "," & @CRLF
    $sStruct &= "!" & @TAB & '"info" = ' & $sInfo
    $sStruct &= @CRLF
    $sStruct &= "!" & @CRLF
    $sStruct &= "! }" & @CRLF & @CRLF

    ConsoleWrite($sStruct)

    Return $vReturnValue
EndFunc ;==> Exception

 

How to use? - Example 1

Func Example()
    Local $sFile = FileOpen(@ScriptDir & "\example.py")
    If $sFile = -1 Then
        Return Exception("Failed to open 'example.py', File not exist!")
    EndIf
    ; continue working
EndFunc

Example()

Example 1 Output in Scite console:

Exception 1.png

Example 2

Func Example2()
    Local $oHttp = ObjCreate("WinHttp.WinHttpRequest.5.1.Fake") ; added .Fake to make object wrong.
    If Not IsObj($oHttp) Then
        Return Exception("Failed to create Object in variable $oHttp.", 2.2)
    EndIf
    ; continue working
EndFunc

Local $vRet = Example2()

ConsoleWrite("$vRet = " & $vRet & @CRLF)

Example 2 Output in Scite console:

Exception 2.png

Edited by Ascer
Link to comment
Share on other sites

  • 3 weeks later...

This is super! I normally do this through a message box or the like. Its kind of ironic that this type of error checking is almost always required, yet I had never thought to write a function to be used as the goto, instead opting to use Consolewrite and message boxes written at the time of error to figure out what value is being passed when something unexpected is being returned. This will go into my standard includes.
Thank you.

 

Edited by Draygoes
Spoiler

 

"If a vegetarian eats vegetables,What the heck does a humanitarian eat?"

"I hear voices in my head, but I ignore them and continue on killing."

"You have forced me to raise the indifference warning to beige, it's a beige alert people. As with all beige alerts please prepare to think about the possibility of caring."

An optimist says that giving someone power DOESN'T immediately turn them into a sadist. A pessimist says that giving someone power doesn't IMMEDIATELY turn them into a sadist.

 

 
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...