When error occurs in one of the watchers, $digest() cannot handled errors via $exceptionHandler service,
In this case you have to handle exception yourself.
While $apply() uses try catch block internally to handle errors and if error occurs in one of the watchers then it
passes errors to $exceptionHandler service.
Pseudo-Code of $apply()
function $apply(expr) {
try {
return $eval(expr);
} catch (e) {
$exceptionHandler(e);
} finally {
$root.$digest();
}
}