Site icon Blog SIG dan Geografi

Tips dan trik Error handling Pada Script Tool Phyton

ArcGIS sangat intens menggunakan Phyton sebagai salah satu bahasa scriptingnya, banyak sekali contoh atau tool yang digunakan oleh ArcGIS menggunakan Phyton.
Bagi anda yang senang melakukan otomati data di ArcGIS, maka bahasa ini patut dipertimbangkan untuk dipelajari, dan tentu saja dalam belajar, menemui error saat running script sangat sering terjadi, berikut merupakan tips error handling pada Phyton di ArcGIS.

Tip #1 – Gunakan arcgisscripting.ExecuteError exception

pada versi 9.2 dikenalkan obyek arcgisscripting yang meliputi juga kelas eksepsi baru, arcgisscripting.ExecuteError. kelas ini muncul bila tool atau fungsi geoprocessing terjadi error. sehingga anda dapat memilah error menjadi 2 bagian, yaitu error geoprocessing dan error lainnya. sebagai contoh kode di bawah ini :

import arcgisscripting
gp = arcgisscripting.create(9.3)
try:
result = gp.getcount("C:/blah.shp")
# x = y

# Return GEOPROCESSING specific errors
#
except arcgisscripting.ExecuteError:
gp.AddError(gp.GetMessages(2))

# Return any PYTHON or system specific errors
#
except:
gp.AddError("Python or system error occurred")

kode di atas digunakan sebagai sumber dari script tool. agar sederhana, tidak digunakan parameter sama sekali. ketika dieksekusi fungsi getcount akan memanggil file blah.shp yang tidak ada sehingga error muncul. dialognya sebagai berikut :

untuk membuktikan perbedaan bagaimana error phyton dan error geoprocessing di handel secara berbeda ganti 2 baris di atas menjadi :

# result = gp.getcount("C:/blah.shp")
x = y

ketika script di eksekusi akan ada error yang keluar karena variabel y belum didefinisikan, dan dialognya akan menjadi :

Tip #2 – Hati-hati mendapat pesan error dari obyek hasil

Sebelumnya sedikit penjelasan pada script dibawah ini :

result = gp.getcount("C:/blah.shp")

jika call getcount diatas muncul eksepsi, obyek hasil adalah null. ini berarti anda tidak dapat menjumpai pesan error dari obyek hasil, sebagai contoh :

import arcgisscripting
gp = arcgisscripting.create(9.3)
try:
result = gp.getcount("C:/blah.shp")

# Return GEOPROCESSING specific errors
# (this method is INCORRECT!)
except arcgisscripting.ExecuteError:
gp.AddError(result.GetMessages(2))

# Return any PYTHON or system specific errors
#
except:
gp.AddError("Python or system error occurred")

kode diatas akan gagal dengan pesan “name ‘result’ is not defined”. Ini dikarenakan fakta bahwa obyek hasil adalah null. Karena obyek hasil adalah null, maka error Phyton akan muncul karena obyek null tidak mempunyai metode GetMessages(). untuk catatan, hasil geoprocessing di arcgis server tidak pernah menghasilkan null, null hanya terjadi pada eksekusi lokal.

Tip #3 – Gunakan AddReturnMessage() untuk mempertahankan links menuju kode error

mulai versi 9.3, nomor error geoprocessing terlihat pada dialog progres yang mempunyai link ke penjelasan. untuk menampilkan link ini, anda harus menggunakan variabel AddReturnMessage() sebagai contoh :

import arcgisscripting
gp = arcgisscripting.create(9.3)
try:
result = gp.getcount("C:\\blah.shp")

# Return GEOPROCESSING specific errors
#
except arcgisscripting.ExecuteError:
for msg in range(0, gp.MessageCount):
if gp.GetSeverity(msg) == 2:
gp.AddReturnMessage(msg)

# Return any PYTHON or system specific errors
#
except:
gp.AddError("Python or system error occurred")

ketika script dieksekusi, akan memunculkan error sebagai berikut ;

Tip #4 — menggunakan traceback untuk menampilkan lebih banyak informasi mengenai error

Pada versi 9.3, anda dapat menjalankan script in-process, script seperti ini berjalan lebih cepat karena diload oleh program ke dalam memory. karena script ada di memory trackback Phyton tidak dapat mengetahui nama dari script dan hanya memunculkan ““. Jika anda ingin memunculkan nama (berguna untuk debugging), anda harus menyediakannya sendiri.
skrip di bawah ini adalah rutin lokal, trace(), yang menggunakan modul trackback untuk menampilkan nomor baris, nama file, dan deskripsi error. rutin ini juga mengikutsertakan nama file yang harus disesuaikan dengan nama skripnya.

import arcgisscripting
gp = arcgisscripting.create(9.3)
try:
def trace():
import os, sys, traceback
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0] # script name + line number
line = tbinfo.split(", ")[1]

# Construct the pathname to this script. Get the pathname
# to the folder containing the script using sys.path[0].
# Modify line below and replace 'myscript.py' with the name of
# this script.
#
filename = sys.path[0] + os.sep + "myscript.py"

# Get Python syntax error
#
synerror = traceback.format_exc().splitlines()[-1]
return line, filename, synerror
if __name__ == '__main__':
# y = x
result = gp.getcount("C:/blah.shp")

except arcgisscripting.ExecuteError:
# Call our trace routine to retrieve line number and filename.
# (returned variable 'err' is ignored since this is a gp error.
#
line, filename, err = trace()
gp.AddError("Geoprocessing error on " + line + " of " + filename + " :")
for msg in range(0, gp.MessageCount):
if gp.GetSeverity(msg) == 2:
gp.AddReturnMessage(msg)

except:
line, filename, err = trace()
gp.AddError("Python error on " + line + " of " + filename)
gp.AddError(err)

beriktu adalah ilustrasi error yang memunculkan nomor baris, nama file pada proses geoprocessing dan Phyton syntax (dengan mengkomen baris y = x )

Tip #5 — Gunakan statement difinalisasi untuk membersihkan kursor

Apapun yang terjadi di phyton script anda, blok script yang difinalisasi akan selalu dieksekusi. ini adalah tempat yang baik untuk melakukan proses pembersihan, seperti hapus kursor, seperti dalam kode di bawah ini :

import arcgisscripting
gp = arcgisscripting.create(9.3)

def trace():
import os, sys, traceback
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
line = tbinfo.split(", ")[1]
filename = sys.path[0] + os.sep + "testscript.py"
synerror = traceback.format_exc().splitlines()[-1]
return line, filename, synerror

if __name__ == '__main__':
# Define variables for a cursor and its row
#
cursor, row = None, None
try:
cursor = gp.searchcursor("E:/Data/CityOfSanFrancisco.gdb/FireStations")
row = cursor.Next()
while row:
# Code here...
# for demonstration...this next statement will cause an error
y = x
row = cursor.Next()
except arcgisscripting.ExecuteError:
line, filename, err = trace()
gp.AddError("Geoprocessing error on " + line + " of " + filename + " :")
for msg in range(0, gp.MessageCount):
if gp.GetSeverity(msg) == 2:
gp.AddReturnMessage(msg)
except:
line, filename, err = trace()
gp.AddError("Python error on " + line + " of " + filename)
gp.AddError(err)
finally:
# Close cursor and row objects.
#
del row, cursor

# Print a message for demo purposes
#
gp.AddMessage("\n ** Cursor and row have been deleted ** \n")

pada ilustrasi di bawah, kursor akan tetap dihapus walaupun kode memunculkan error :

Pada bodi utama skrip, variabel kursor dan obyek kolom dideklarasikan dan diinialisasi menjadi none, ini akan memastikan bahwa dua variabel ini ada ketika statemen del di blok finalisasi dijalankan, ketika anda menghapus variabel yang tidak ada, akan muncul error.

njoy :beer:

source : ESRI blog

Exit mobile version
Skip to toolbar