Вы можете заключить простую операцию получения объекта в отдельную функцию.Вы можете перехватить там исключение:
bool TryGetObject( ExAPI api, int idx, out object obj )
{
try
{
obj = api[idx];
return true;
}
catch( IndexOutOfBoundsException )
{
return false;
}
}
Затем вызвать эту функцию и завершить, если необходимо:
static IEnumerable<object> Iterator( ExAPI api )
{
bool abort = false;
for( int i = 0; !abort; ++i )
{
object obj;
if( TryGetObject( api, i, out obj ) )
{
yield return obj;
}
else
{
abort = true;
}
}
}