I can't see this documented in the Esri help files, so I'm entering it here for posterity.
According to Jason Scheirer from the Esri ArcPy team this is the intended behaviour:
The
.next()
method raises an error by design: it follows to the letter the Python Iterator Protocol, which requires the.next()
method on an object to raise aStopIteration
exception when it is exhausted.
The suggested behaviour is to use a for
iterator on the cursor, ie without using the next() method at all:
with arcpy.da.SearchCursor(fc, fields) as cursor:
for row in cursor:
In my case I wanted to perform an action when there was no row - I found that a Try, Except block worked well:
with arcpy.da.SearchCursor(fc, fields, where) as cursor:
try:
row = cursor.next()
print(row)
except StopIteration:
print("No rows")
except:
print("something else went wrong")