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 (original Esri forums post):
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 approach 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")