Abbruchverhalten in Skriptwerkzeugen

Wenn ein Werkzeug ausgeführt wird, steht eine Schaltfläche zur Verfügung, mit der weitere Verarbeitungsvorgänge des Werkzeugs beendet werden können. Wenn ein Skriptwerkzeug oder ein Werkzeug der Python-Toolbox abgebrochen wird, wird das Skript standardmäßig nach der aktuellen Codezeile abgebrochen, und es wird eine entsprechende Fehlermeldung ausgegeben, z. B. ('Abgebrochenes Skript <tool_name>... (<tool_name>) vom Benutzer abgebrochen.'). In diesem Fall ist der Abbruch endgültig; nach diesem Abbruch kann kein Code mehr ausgeführt werden. Für einige Skripte ist dies ausreichend, in anderen Fällen sind nach dem Abbruch jedoch möglicherweise Schritte erforderlich, um die Daten zu bereinigen und Werkzeugmeldungen oder andere Verhalten bereitzustellen.

Die arcpy.env Klasse umfasst die beiden Eigenschaften autoCancelling und isCancelled zum Steuern des Abbruchverhaltens. autoCancelling ist standardmäßig auf True eingestellt, sodass der Abbruch nach der aktuellen Zeile erfolgt, wenn ein Werkzeug abgebrochen wird. Wenn autoCancelling auf False gesetzt wurde, wird das Skript weiterhin ausgeführt, bis Sie es beenden. Wenn ein Werkzeug abgebrochen wurde, ändert sich die Schreibschutzeigenschaft isCancelled von False in True.

EigenschaftBeschreibung

arcpy.env.autoCancelling

Wenn autoCancelling auf True eingestellt ist, wird das Skript beim Abbruch in der aktuellen Zeile beendet. Bei False wird die Eigenschaft isCancelled bei einem Abbruch auf True gesetzt und die Ausführung fortgesetzt. autoCancelling ist standardmäßig auf True festgelegt.

arcpy.env.isCancelled

Wenn autoCancelling auf False eingestellt ist und das Werkzeug abgebrochen wurde, wird isCancelled auf True gesetzt. isCancelled ist standardmäßig False und eine Schreibschutzeigenschaft.

Im folgenden Beispiel wird ein Demonstrationswerkzeug dargestellt, das eine Reihe von Tabellen verwendet, eine Kopie erstellt und diese Zwischentabellen zusammenführt. Wenn der Standardwert True von autoCancelling beibehalten wird, wird das Skript bei einem Abbruch nach der aktuellen Zeile beendet. Dieses spezielle Werkzeug hat die Eigenschaft, dass es im Hintergrund mehrere Zwischentabellen erstellt, die in jedem Fall, auch bei einem Abbruch, bereinigt werden sollen. Wenn autoCancelling auf False eingestellt wird, wird der Abbruch verzögert und das Skript kann nach jedem ausgewählten Intervall oder jeder Stelle im Code suchen, indem die Eigenschaft isCancelled ausgewertet wird. Nachdem isCancelled in True geändert wurde, bedeutet dies, dass das Werkzeug abgebrochen und die Direktdaten vor der Fertigstellung gelöscht werden.

import arcpy
arcpy.env.autoCancelling = False
class CustomCancelException(Exception):
    """Custom exception for geoprocessing tool cancellations"""
    pass
def my_function(tables, output):
    temp_tables = []
    try:
        for table in tables:
            temp_tables.append(arcpy.CopyRows_management(table, '#')[0])
            # If isCancelled is True this means that the cancel button
            # has been pressed
            if arcpy.env.isCancelled:
                raise CustomCancelException('Tool has been cancelled')
        arcpy.Merge_management(tables, output)
    except CustomCancelException as err:
        arcpy.AddError(err)
    finally:
        # If tool is cancelled or finishes successfully, clean up intermediate data
        if temp_tables:
            for temp_table in temp_tables:
                arcpy.Delete_management(temp_table)
      
if __name__ == '__main__':
    inputs = arcpy.GetParameter(0)
    out_fc = arcpy.GetParameterAsText(1)
    my_function(inputs, out_fc)