Select to view content in your preferred language

How to bypass raise Error in if else statement

52
1
yesterday
LoriEmersonKDOT
Regular Contributor

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
    
    

  

0 Kudos
1 Reply
RichardDaniels
MVP Regular Contributor

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

0 Kudos