arcgis python 異常處理

import arcpy

in_features = "c:/base/transport.gdb/roads"

try:
    # Note: CopyFeatures will always fail if the input and output are
    # the same feature class
    arcpy.CopyFeatures_management(in_features, in_features)

except arcpy.ExecuteError:
    print arcpy.GetMessages()
==================
import arcpy

try:
    # If a tool produces a warning, it will throw an exception
    arcpy.SetSeverityLevel(1)

    # Note: DeleteFeatures on a feature class will always return a warning
    arcpy.DeleteFeatures_management("c:/base/transport.gdb/roads")

except arcpy.ExecuteWarning:
    print arcpy.GetMessages()

  

try-except 語句
try-except 語句可用於封裝整個程序,或者只封裝要捕捉和標識錯誤的特定代碼段。若是 try 語句中發生錯誤,則會引起異常,而後會執行 except 語句下的代碼。使用簡單的 except 語句是最基本的錯誤處理方式。

在如下代碼中,因爲未使用所需的「距離」參數,致使緩衝執行失敗。爲了在失敗以後顯示說明性的提示,使用了 except 語句來捕捉錯誤,而後獲取並打印緩衝生成的錯誤消息。請注意,只有在緩衝返回錯誤後纔會執行 except 代碼塊。

import arcpy

try:
    # Execute the Buffer tool
    #
    arcpy.Buffer_analysis("c:/transport/roads.shp", "c:/transport/roads_buffer.shp")
except Exception as e:
    print e.message
    
    # 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.message)

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

class LicenseError(Exception):
    pass

import arcpy
from arcpy import env

try:
    if arcpy.CheckExtension("3D") == "Available":
        arcpy.CheckOutExtension("3D")
    else:
        # Raise a custom exception
        #
        raise LicenseError
    
    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:
    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

arcpy.env.overwriteOutput = 1
fc = arcpy.GetParameterAsText(0)

try:
    # Check that the input has features
    #
    result = arcpy.GetCount_management(fc)
    if int(result.getOutput(0)) > 0:
        arcpy.FeatureToPolygon_management(fc, os.path.dirname(fc) + os.sep + "out_poly.shp")
    else:
        # Raise custom exception
        #
        raise NoFeatures(result)

except NoFeatures:
    # The input has no features
    #
    print fc + " has no features."
except:
    # By default any other errors will be caught here
    #
    print arcpy.GetMessages(2)

ExecuteError 類
地理處理工具失敗時會拋出 ExecuteError 異常類。這說明您能夠將錯誤分紅兩組,即將地理處理錯誤(拋出 ExecuteError 異常的錯誤)歸爲一組,而將全部其餘錯誤歸爲一組。而後,可分別採用不一樣的方式處理這些錯誤,以下面的代碼中所示: 

import arcpy

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:    
    arcpy.AddError("Non-tool error occurred")

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 + "\n"
    print msgs

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

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

代碼
 產生的錯誤
 
arcpy.GetCount_management("")
 
PYTHON ERRORS:
Traceback info:
  File "c:\temp\errortest.py", line 10, in <module>
    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 <module>

    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 <module>

    float("a text string")
Error Info:
invalid literal for float(): a text string


 

錯誤結果
從結果對象獲取錯誤消息
有關結果對象的快速表達以下所示:

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

若是調用 GetCount 引起了異常,則結果對象爲空。這表示沒法從結果對象中檢索錯誤消息。

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

# Return GEOPROCESSING specific errors
# (this method is INCORRECT!)
except:
    arcpy.AddError(result.getMessages(2))

上述代碼失敗,並顯示消息「未定義名稱‘result’」。這是因爲結果對象因工具失敗而沒法進行建立。由於未建立結果對象,所以會在嘗試使用 getMessages 方法時引起 Python 錯誤。

注注:即便在工具失敗的狀況下,也會建立經過調用 ArcGIS for Server 上的地理處理服務所建立的結果對象。僅當工具在本地運行且引起錯誤時,建立結果對象纔會失敗。有關使用結果對象的詳細信息,請參閱從地理處理工具獲取結果。
相關文章
相關標籤/搜索