Why does my arcpy code raise an error even though the if/else statement says to bypass it? For example, why does the raise RouteError still happen when if row[3] == "NO ERROR" is true?
class RouteError(Exception):
pass
import arcpy
import sys
arcpy.env.overwriteOutput = True
def CalcPavementArea_tool(in_FC, in_RouteIdx, in_Workspace, in_LRS, out_Poly_Area):
try:
# -------------------------------------------
# Define workspace using input paramter value
# -------------------------------------------
arcpy.env.workspace = in_Workspace
my_RouteID_FromTo_Measures_Table = in_Workspace + "\\input_RouteId_FromTo_Measures"
# ---------------------------------------------------------
# Update table with user's RouteId,, From, and To Measures
# ---------------------------------------------------------
fields_inputRoute = ['RouteId', 'FromMeasure', 'ToMeasure']
with arcpy.da.UpdateCursor(my_RouteID_FromTo_Measures_Table, fields_inputRoute) as cursor:
for row in cursor:
#Update RouteId, FromMeasure, ToMeasure values
row[0] = in_RouteId
row[1] = in_FromMeasure
row[2] = in_ToMeasure
cursor.updateRow(row)
arcpy.AddMessage("Update to RouteId=" + in_RouteId + ", FromMeasure=" + in_FromMeasure + ", ToMeasure=" + in_ToMeasure + " input table completed successfully")
# ---------------------------------------------------------
# Make Route Event from LRS_County and User's input
# ---------------------------------------------------------
# Make Route Event Layer (Make Route Event Layer) -- from input RouteId, and From/To measure
output_RouteId_FromToMeasures_Events = "input_RouteId_FromToMeasures Events"
arcpy.lr.MakeRouteEventLayer(
in_routes=in_LRS,
route_id_field="RouteId",
in_table=my_RouteID_FromTo_Measures_Table,
in_event_properties="RouteId; LINE; FromMeasure; ToMeasure",
out_layer=output_RouteId_FromToMeasures_Events,
add_error_field="ERROR_FIELD",
add_angle_field="NO_ANGLE_FIELD",
angle_type="NORMAL",
complement_angle="ANGLE",
offset_direction="LEFT",
point_event_type="POINT")
arcpy.AddMessage("Make Route Event Layer completed successfully")
# ---------------------------------------------------------
# Verify Route Results -- LOC_ERROR
# ---------------------------------------------------------
myEventFields = ["RouteId", "FromMeasure", "ToMeasure", "LOC_ERROR"]
with arcpy.da.SearchCursor("input_RouteId_FromToMeasures Events", myEventFields) as srchCursor:
for row in srchCursor:
if row[3] == "No Error":
arcpy.AddMessage("RouteId=" + str(row[0]) + ": FromMeasure=" + str(row[1]) + " ToMeasure=" + str(row[2]) + " are valid.")
else:
if row[3] == "Measure Extent Out Of Route Measure Range":
arcpy.AddWarning("Measure Extent Out Of Route Measure Range. RouteId=" + str(row[0]) + ": FromMeasure=" + str(row[1]) + " ToMeasure=" + str(row[2]))
else:
arcpy.AddError(row[3] + ". RouteId=" + str(row[0]) + ": FromMeasure=" + str(row[1]) + " ToMeasure=" + str(row[2]))
raise RouteError
# ---------------------------------------------------------
# Export the Route Event to a Feature Class
# ---------------------------------------------------------
arcpy.conversion.ExportFeatures(
output_RouteId_FromToMeasures_Events,
out_features=in_Workspace + r"\RouteId_FromToMeasures_Events",
use_field_alias_as_name="NOT_USE_ALIAS",
field_mapping=None
)
arcpy.AddMessage(in_Workspace + r"\RouteId_FromToMeasures_Events" + " EXPORT completed successfully")
return
except RouteError:
arcpy.AddMessage("Script ended unsuccessfully")
except arcpy.ExecuteError:
arcpy.AddMessage(arcpy.GetMessages(2))
except Exception as e:
print("Other error:", e)
if __name__ == "__main__":
## -------------------------------------------------------
## Grab parameter values and pass to our tool
## -------------------------------------------------------
in_FC = arcpy.GetParameterAsText(0) # -- feature class
in_LRS = arcpy.GetParameterAsText(1) # -- LRS
in_RouteIdx = arcpy.GetParameterAsText(2) # -- RouteId
in_FromMeasure = arcpy.GetParameterAsText(3)
in_ToMeasure = arcpy.GetParameterAsText(4)
in_Workspace = arcpy.GetParameterAsText(5) # -- workspace
out_Poly_Area = arcpy.GetParameterAsText(6) # -- output polygon
arcpy.AddMessage(in_RouteIdx)
arcpy.AddMessage(in_FromMeasure)
arcpy.AddMessage(in_ToMeasure)
CalcPavementArea_tool(in_FC, in_RouteIdx, in_Workspace, in_LRS, out_Poly_Area)
#arcpy.SetParameterAsText(2, "Result") # -- Output polygon with paved surface area
do you want the 'except' blocks to flow like that or, if there is an exception, do you want to show the appropriate message and then 'break' out of the try block? Along the lines of:
except ZeroDivisionError:
# Handle division by zero
print("Error: Cannot divide by zero.")
return None # You could also raise an exception here