Well ``IntegrityError`` is only one option of many. There is also overflow, which in case of MySQL might only raise a warning if a string is longer than the char column definition. Invalid choice option if choices is defined on the model field isn't taken into account for at all atm.
The widget.clean approach is very basic and does not take into account what is defined on the model field for data integrity.
Also on the upside calling field.clean will always raise a ValidationError with a user friendly error message.