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](http://forums.arcgis.com/threads/108627)):

> The `.next()` method raises an error by design: it follows to the letter [the Python Iterator Protocol](http://legacy.python.org/dev/peps/pep-0234/), which requires the `.next()` method on an object to raise a `StopIteration` 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")