defer updating position until end, since it shouldn't update if there's an error