Hibakezelés
Az OOB utasítások közül az egyik első dolog a hibakezelés megírása. Egy jó hibakezelő ugyanis sokat segít a kód írásában. Természetesen a bash tartalmaz hibakezelést és nem cél annak kiváltása. Nekünk csak az objektumokkal kapcsolatos hibák kezelését kell megírnunk.
A hibakezelést a basic.oob fájlba írjuk meg. A fájl verziószámát megváltoztatjuk, így az 0.0.1 lesz:
# # OOB internal # basic.oob, version 0.0.1 # https://oob.xport.hu # basic commands for Object Oriented Bash do=0 # descriptor of the root object oob_trap() { # input: arguments from caller # result: oob_trap (local associative array) local i=1; local -A oob_trap while [[ ${FUNCNAME[i]} == oob_?* ]]; do ((i++)); done # find user command oob_trap=( [file]="${BASH_SOURCE[i]}" [line]=${BASH_LINENO[i-1]} [command]=${FUNCNAME[i-1]} [function]=${FUNCNAME[1]} ) oob_trapExec "$@" # execute (user) trap } # oob_trap() oob_trapExec() { echo "$@ (file: ${oob_trap[file]}, line: ${oob_trap[line]}, command: ${oob_trap[command]})" >&2; exit 1; }
Az első utasítás létrehozza a gyökérobjektum leíróját. Mivel a gyökérobjektum az egész világot jelképezi, ezért azt nem tudjuk modellezni. Így nem is tartozik egyetlen osztályba sem, ezért a leírójának tartalma a zérus számjegy.
Az oob_trap utasítás meghívása esetén a bash belső változóinak lekérdezésével kitölti az oob_trap asszociatív tömböt, amely a hiba előfordulásának helyéről tartalmaz információkat. A FUNCNAME tömb fordított sorrendben tartalmazza azoknak a függvényeknek a neveit, amelyeken keresztül a program eljutott az oob_trap meghívásához.
A tömbben megkeressük azt a függvényt, amelyik neve nem az oob_ karaktersorozattal kezdődik, tehát azt, amelyik meghívta az első OOB függvényt. Ebből következik, hogy a helyes működés érdekében az OOB saját függvényeinek (a működtető parancsok és segédfüggvényei) neve az oob_ karaktersorozattal kezdődik.
A megtalált függvénynek az indexét használva kikeressük a többi adatot. A BASH_SOURCE tömbből azt a szkriptfájlt, amelyik tartalmazza a megtalált függvényt, a BASH_LINENO tömbből kikeressük a szkriptben annak a sornak a sorszámát, amelyikben meghívódik az OOB és a FUNCNAME tömbből a meghívott OOB parancsot és azt, amelyik az oob_trap függvényt meghívta. A FUNCNAME, BASH_SOURCE, BASH_LINENO tömbök a bash saját tömbjei, amelyet az kezel és tölt ki, így ezeket csak le kell kérdeznünk.
Miután kitöltöttük az oob_trap tömböt, meghívjuk az oob_trapExec függvényt, amely az adatokat és az oob_trap függvénynek átadott hibaüzenetet kiírja a hibacsatornába. Ezután az exit 1 utasítással befejezi a szkript futását. A szkript így az 1 hibakóddal tér vissza. Ha más hibafeldolgozást szeretnénk, akkor egy másik oob_trapExec függvényt kell betöltenünk, amelyik a már betöltöttet felülírja, így nem kell hozzányúlnunk a basic.oob fájlhoz. A teszteléshez átírjuk a develop.sh fájl ## run szakaszát:
## run
oob_t1() { oob_t2 "$@"; }
oob_t2() { [[ $1 == "OK" ]] || oob_trap "Error test!"; }
main() {
oob_t1 "$@"
o_star_planet4_moon1_sayHello
}
: set -x; main "$@"; set +xHa most kiadjuk a $HOME/develop.sh OK parancsot, akkor a szkript ugyanúgy lefut, mint eddog. Ha nem az OK az első argumentum, akkor a hibaág hajtódik végre.