The bad file contains those rows that had an error. Maybe the data file had some format errors, or maybe you had some constraints violated.
The discard file is not related to errors, but to data which didn't satisfy any of the when clauses in your control file.
For example, you could state that only data with a>3 (being 'a' a field) be loaded.
Then a field like that:
a b c
2 1 3
would be discarded.
Then, if a is a PK, and you have a row whose value is 1, a field like that:
a b c
1 1 1
would be bad.
Regards