TestNGException or sub-exception are expected when a user made an error (case2: wrong param match or case3: data provider missing) and he is supposed to fix it.
In the case of TestNGException, the run is not supposed to have results.
When the data provider run fails, then we cannot determine the result of the test(s) and that's why they are skipped.