ArcGIS | 使用 Python 處理錯誤

2021-12-31 GIS前沿

錯誤總是在所難免。編寫可預見和處理錯誤的腳本可讓您節省大量時間,同時避免很多令人頭疼的問題。當工具返回錯誤消息時,ArcPy 會生成系統錯誤或異常。在 Python 中,您能夠提供多種可用於處理異常的結構和方法。當然,也會由於其他與地理處理工具不相關的原因導致腳本失敗。同時需要以適當的方式發現和處理這些問題。以下部分會提供一些方法,這些方法介紹了 Python 異常處理的基礎知識。

當工具發出錯誤消息時,ArcPy 會生成 arcpy.ExecuteError 異常。Python 允許您編寫可在生成系統錯誤時立即自動運行的例程。在此錯誤處理例程中,可從 ArcPy 檢索錯誤消息並作出相應的反應。如果腳本沒有錯誤處理例程,則會立即失敗,這就會降低它的穩定性。可使用錯誤處理例程來管理錯誤並提高腳本的可用性。

地理處理工具錯誤消息帶有六位代碼。這些 ID 代碼已記錄在案,可提供有關這些消息產生原因及處理方式的附加信息。

try-except 語句

try-except 語句可用於封裝整個程序或只封裝代碼的特定部分來捕捉和標識錯誤。如果 try 語句中發生錯誤,則會引發異常,然後會執行 except 語句下的代碼。使用基本的 except 語句是最基本的錯誤處理方式。

在以下代碼中,由於未提供所需的 buffer_distance_or_field 參數,導致緩衝執行失敗。為了在失敗之後顯示說明性的提示,使用了 except 語句來捕捉錯誤,然後獲取並列印緩衝生成的錯誤消息。請注意,只有在緩衝返回錯誤後才會執行 except 塊。

import arcpy

import sys

try:

    # Execute the Buffer tool

    arcpy.Buffer_analysis("c:/transport/roads.shp", "c:/transport/roads_buffer.shp")

except Exception:

    e = sys.exc_info()[1]

    print(e.args[0])

    # If using this code within a script tool, AddError can be used to return messages

    #   back to a script tool. If not, AddError will have no effect.

    arcpy.AddError(e.args[0])

try 語句有一個可選的 finally 子句,可用於無論是否出現異常都始終應該執行的任務。下例中,ArcGIS 3D Analyst extension 通過 finally 子句檢入,從而確保始終都會檢入該擴展模塊。

class LicenseError(Exception):

    pass

import arcpy

try:

    if arcpy.CheckExtension("3D") == "Available":

        arcpy.CheckOutExtension("3D")

    else:

        # Raise a custom exception

        raise LicenseError

    arcpy.env.workspace = "D:/GrosMorne"

    arcpy.HillShade_3d("WesternBrook", "westbrook_hill", 300)

    arcpy.Aspect_3d("WesternBrook", "westbrook_aspect")

except LicenseError:

    print "3D Analyst license is unavailable" 

except arcpy.ExecuteError:

    print(arcpy.GetMessages(2))

finally:

    # Check in the 3D Analyst extension

    arcpy.CheckInExtension("3D")

raise 語句

上一個示例可用於處理代碼中發生的異常。在某些情況下,可能需要創建自定義的異常。此時,可使用 raise 語句。在以下代碼中,在識別出輸入要素類未包含任何要素時使用了 raise 語句。從嚴格意義上來說,這並不屬於錯誤,而只是使用代碼來預防的一種情況。

class NoFeatures(Exception):

    pass

import arcpy

import os

import sys

arcpy.env.overwriteOutput = True

fc = arcpy.GetParameterAsText(0)

try:

    # Check that the input has features

    result = arcpy.GetCount_management(fc)

    if int(result[0]) > 0:

        arcpy.FeatureToPolygon_management(

            fc, os.path.join(os.path.dirname(fc), 'out_poly.shp'))

    else:

        # Raise custom exception

        raise NoFeatures(result)

except NoFeatures:

    # The input has no features

    print('{} has no features'.format(fc))

except:

    # By default any other errors will be caught here

    e = sys.exc_info()[1]

    print(e.args[0])

ExecuteError 類

地理處理工具失敗時會拋出 arcpy.ExecuteError 異常類,這說明您可以將錯誤分成不同的組,即,將地理處理錯誤(拋出 arcpy.ExecuteError 異常的錯誤)歸為一組,而將所有其他異常類型歸為一組。然後,可分別採用不同的方式處理這些錯誤,如下面的代碼中所示:

import arcpy

import sys

try:

    result = arcpy.GetCount_management("C:/invalid.shp")

# Return geoprocessing specific errors

except arcpy.ExecuteError:   

    arcpy.AddError(arcpy.GetMessages(2))   

# Return any other type of error

except:

    # By default any other errors will be caught here

    e = sys.exc_info()[1]

    print(e.args[0])

traceback

在較大較複雜的腳本中,可能很難確定錯誤的確切位置。可以將 Python 的 sys 和 traceback 模塊結合使用來找出錯誤的準確位置和原因,這種方法可以較為準確地標識出錯誤的原因,從而節省您寶貴的調試時間。

# Import the required modules

#

import arcpy

import sys

import traceback

arcpy.env.workspace = "C:/Data/myData.gdb"

try:

    arcpy.CreateSpatialReference_management()

    #-

    # Your code goes here

    #

    # See the table below for examples

    #-

except arcpy.ExecuteError:

    # Get the tool error messages

    msgs = arcpy.GetMessages(2)

    # Return tool error messages for use with a script tool

    arcpy.AddError(msgs) 

    # Print tool error messages for use in Python/PythonWin

    print(msgs)

except:

    # Get the traceback object

    tb = sys.exc_info()[2]

    tbinfo = traceback.format_tb(tb)[0]

    # Concatenate information together concerning the error into a message string

    pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])

    msgs = "ArcPy ERRORS:\n" + arcpy.GetMessages(2) + "\n"

    # Return python error messages for use in script tool or Python window

    arcpy.AddError(pymsg)

    arcpy.AddError(msgs)

    # Print Python error messages for use in Python / Python window

    print(pymsg)

    print(msgs)

如果使用了上述代碼並且地理處理工具發生了錯誤(如輸入無效),則會引發 arcpy.ExecuteError,並會使用第一個 except 語句。此語句將使用 GetMessages 函數列印出錯誤消息。如果使用相同的代碼但發生的錯誤類型不同,則會使用第二個 except 語句。該語句將獲取 traceback 對象並列印相應的系統錯誤消息,而不是列印地理處理消息。

下面列出了可替換到上述代碼中的三條不同的代碼行預計會產生的錯誤。第一個示例產生了地理處理工具錯誤,會列印出 traceback 信息和地理處理錯誤消息。第二個和第三個示例與地理處理並不相關,只會列印 traceback 信息。

錯誤結果

代碼

產生的錯誤

arcpy.

GetCount_management("")

PYTHON ERRORS:

Traceback info:

  File "c:\temp\errortest.py", line 10, in

    arcpy.GetCount_management("")

Error Info:

Failed to execute. Parameters are not valid.

ERROR 000735: Input Rows: value is required

Failed to execute (GetCount).

ArcPy ERRORS:

Failed to execute. Parameters are not valid.

ERROR 000735: Input Rows: value is required

Failed to execute (GetCount).

x = "a" + 1

PYTHON ERRORS:

Traceback info:

  File "c:\temp\errortest.py", line 10, in

    x = "a" + 1

Error Info:

cannot concatenate 'str' and 'int' objects

float("a text string")

PYTHON ERRORS:

Traceback info:

  File "c:\temp\errortest.py", line 10, in

    float("a text string")

Error Info:

invalid literal for float(): a text string

從結果對象獲取錯誤消息

有關 Result 對象的快速表達如下所示:

result = arcpy.GetCount_management("c:/data/rivers.shp")

如果調用 GetCount_management 引發了異常,則不會創建 Result 對象。這表示無法從 Result 對象中檢索錯誤消息。

import arcpy

try:

    result = arcpy.GetCount_management("c:/data/rivers.shp")

# Return Geoprocessing specific errors

# (this method is incorrect!)

except arcpy.ExecuteError:

    arcpy.AddError(result.getMessages(2))

上述代碼失敗,並顯示消息 name 'result' is not defined。這是由於 Result 對象因工具失敗而無法進行創建。因為未創建 Result 對象,因此會在嘗試使用 getMessages 方法時引發 Python 錯誤。

註:

即使在工具失敗的情況下,也會創建通過調用 ArcGIS Server 上的地理處理服務所創建的 Result 對象。僅當工具在本地運行且引發錯誤時,創建 Result 對象才會失敗。有關使用結果對象的詳細信息,請參閱在 Python 中使用工具。

文章授權轉載:gisoracle

相關焦點

  • ArcGIS 使用 Python 處理錯誤
    使用 Python 處理錯誤錯誤總是在所難免。編寫可預見和處理錯誤的腳本可讓您節省大量時間,同時避免很多令人頭疼的問題。
  • ArcGIS Python API可視化及分析系列教程(一):入門與簡介(1)
    Esri官方提供了一個在線雲服務使用ArcGIS Python API,使用方式如下:1、在瀏覽器輸入地址:https://notebooks.esri.com/系統會自動給你建立一個服務,如下所示:輸入如下代碼,即可完成上面那幅圖:from arcgis.gis import GISgis = GIS("https://www.arcgis.com", "arcgis_python
  • PySAL:Python空間計量分析庫使用手冊(一)
    pip安裝使用:pip install pysalPySAL安裝完成後,最後的檢查是啟動Python,導入PySALmodule並運行支持格式的標準檢查。』, Modes: [』r』, 』w』]Ext: 』.kwt』, Modes: [』r』, 』w』]Ext: 』.wk1』, Modes: [』r』, 』w』]Ext: 』.arcgis_dbf』, Modes: [』r』, 』w』]Ext: 』.geobugs_text』, Modes: [』r』, 』w』]Ext: 』.csv』, Modes: [』rU』, 』r』, 』U』, 』Ur』]Ext
  • [Python]文件與異常的錯誤處理
    [Python]文件與異常的錯誤處理1.文件的處理過程# 文件基本操作:打開文件,處理文件,關閉文件the_file = open("sketch.txt", 'r')line_content = the_file.readline()  # 不指定readline的參數,讀取一整行print(line_content)
  • python教程之九錯誤和異常處理
    Python 有兩種錯誤很容易辨認:語法錯誤和異常。語法錯誤語法分析器指出了出錯的一行,並且在最先找到的錯誤的位置標記了顏色,如下所示。 異常Python 程序的語法是正確的,在運行它的時候,也有可能發生錯誤。運行期檢測到的錯誤被稱為異常。
  • 使用Python圖像處理庫Pillow處理圖像文件
    Python圖像處理庫Pillow,幫助讀者進一步了解Python的基本概念:模塊、對象、方法和函數的使用。使用Python語言解決實際問題時,往往需要使用由第三方開發的開源Python軟體庫。本案例使用圖像處理庫Pillow中的模塊、對象來處理圖像:實現讀取圖像、獲取圖像信息、調整圖像大小、旋轉圖像、平滑圖像、剪切圖像等基本圖像處理任務。
  • 如何使用Python批量化處理Excel——零基礎入門指南
    2、 能熟練使用搜尋引擎,明白絕大部分你產生的問題和出現的錯誤都可以在百度上找得到。Python也是這樣的,它已經有了非常強大和完備的函數庫,我們只需要調用函數,然後修改參數,就可以用Python來處理我們自己的表格,它與Excel的區別無非就是沒有可視化圖形界面而已,你選不中單元格,沒有各種菜單選項給你點,你只能手動敲擊文本,但當你學習明白函數、參數、返回值、變量等概念,你就能像使用excel那樣使用命令行來進行python編程,並驚嘆於其強大。
  • 05-GIS和python結合
    之前也簡單介紹過python,python的優點數不勝數,簡單易學、免費開源、面向對象、可擴展性等等,我畢竟不是正兒八經程式設計師,python對於我來說,更多的是服務於GIS這個領域,因此本公眾號用於簡單描述一下GIS和python的結合。首先是python中常用的GIS包,主要包含以下幾類:ArcGIS中的python主要是ArcPy和ArcGIS API for Python。
  • Python學習第50課-處理錯誤和異常
    【每天幾分鐘,從零入門python編程的世界!】在工作當中會經常出現意料不到的錯誤和異常,就需要我們對可能出現的錯誤和異常進行預判,然後加上捕獲和處理錯誤異常的代碼,否則,程序在運行過程中,遇到錯誤和異常就會crash崩潰,無法繼續向下執行。●Python的錯誤種類:①語法錯誤,或稱解析錯誤。
  • Python的錯誤處理方法和調試技巧
    在我們的程序運行中,不可避免地會出現各種各樣的錯誤。造成這些錯誤的原因也多種多樣,可能是因為代碼邏輯存在疏漏,某一種情況我們沒有考慮到;也可能是因為用戶的特殊操作,使我們的程序陷入了未曾涉及的場景……當Python將錯誤信息輸出到控制臺後,我們首先需要定位到錯誤發生的位置。
  • python入門——Python中異常處理
    python大數據課堂已經開始了。想轉行大數據,數據挖掘,機器學習,人工智慧的小夥伴可以關注啦。上一篇帶大家了解了python中的I/O函數。今天我們來繼續了解python中的異常處理。調試環境以python3.6環境為例。需要代碼和demo的朋友可以搜索「欒鵬全棧」到我的CSDN博客。
  • Python異常處理
    問題描述大家在使用python語言寫代碼的時候難免會出一些錯誤,而才入門的朋友們往往不知道是哪裡出了錯或者不知道自己錯在哪裡、什麼錯誤。所以我們要知道是哪行代碼出錯,其次室錯誤的類型是什麼,錯在那個細節,逐步分析,從而解決錯誤並改正。
  • python基礎---異常處理
    程序的異常處理今天霖小白心血來潮想來分享一下python基礎中的如何異常處理,使程序有更好的用戶體驗。前言python程序對用戶的輸入有一定的要求,所以當實際輸入不滿足程序要求時,可能在程序運行過程中會直接報錯無法進行下一步的運行。
  • Python 處理錯誤的原則 | Linux 中國
    https://linux.cn/article-13058-1.html作者:Moshe Zadka譯者:Xingyu.Wang處理「異常情況」是編程中爭論最多的問題之一。這可能是因為風險很大:處理不當的錯誤值甚至可以使龐大的系統癱瘓。
  • python使用with as處理文件的讀寫
    文件處理的兩種情況:1、忘記關閉文件。2、文件讀寫異常,未做處理。在python中使用with語句,可以自動調用close()方法,同時也解決了異常問題。with open('test.txt','w') as f:f.write('Hello, python!')
  • python面向對象之異常處理
    捕獲異常 2.1 簡單的捕獲異常語法 在程序開發中,如果 對某些代碼的執行不能確定是否正確,可以增加 `try(嘗試)` 來 捕獲異常 捕獲異常最簡單的語法格式:```pythontry: 嘗試執行的代碼except: 出現錯誤的處理``` `try
  • 【超詳細】ArcGIS欄位計算器分割欄位中的字符串
    最近在整理植物數據,數據本來是以excel進行存儲,但是其中涉及到要對欄位進行分割,由於對excel的相關函數不熟悉於是想著能不能用arcgis的欄位計算器進行解決,經過摸索成功地解決了自己遇到的問題,並記錄下來,如下:1、目的:用arcgis的欄位計算器將欄位基於特殊字符進行分割,並將分割後的數據保存在對應的新創建的欄位中;
  • ArcGIS Pro系列課第6講《三維模型、OSGB、BIM數據的處理》
    主要方向為ArcGIS Pro製圖、網絡分析、三維數據的處理與分析。>》課程簡介:不同的用戶可能會使用不同的軟體來製作三維模型或數據,本節課將帶你了解這些不同格式的數據如何進入ArcGIS平臺,本次課程將要介紹的內容主要包括:ArcGIS平臺中如何使用三維模型、BIM、傾斜攝影模型;
  • 使用Python處理NetCDF格式文件
    在地球科學領域使用較為廣泛,大多數數值模式,衛星,雷達等數據格式通常為NetCDF格式。目前有非常多的軟體可以處理NetCDF格式文件,並且相當一部分提供了可視化功能。複雜的數據處理工作和二維可視化可以使用matlab,python或NCL,三維可視化可以使用VisAD,Vis5d,IDV等。處理nc文件的工具很多,此次僅利用python來講一下如何處理nc文件。
  • Python使用struct處理二進位
    有的時候需要用python處理二進位數據,比如,存取文件,socket操作時.這時候,可以使用python的struct模塊來完成.可以用 struct