I am a believer in catching problems early.
If code I write needs certain types of data (ie. not just a DataSet value, specifically a non-null value, referring to a DataSet with at least one table, containing at least 1 row), then I will write defensively by explicitly checking this when the method starts.
I do this for checks that can be done reasonably cheap.
For instance, if the method needs an array of objects, that will almost be fairly small, and none of the elements can be null, I will often loop through to check once at the start of the method.
If I have an enumerator on the other hand, or an array that can potentially be large, then I'd rather postpone the actual check to inside the loop.
I've had enough debugging sessions to figure out why a specific exception occurs at some random deep code in the framework, only to figure out that an invalid value passed through N layers of my code first, and the deep down code didn't have enough clues to figure out the specific reason for why it went wrong.