Parce que parfois, le programmeur a plus de connaissance que le compilateur.
E. g. (dans certains de fiction de langue où la division par zéro est considéré comme une erreur):
try {
x = 1 / (a*a + 1);
} catch (DivisionByZeroException ex) {
// Cannot happen as a*a+1 is always positive
}
Comme certaines langues (par exemple Java) nécessitent pour prendre un peu de/beaucoup de/toutes les exceptions, le compilateur peut se plaindre alors que le programmeur sait qu'il n'est pas possible. Parfois, la seule façon d'obtenir le compilateur de la fermer, est explicitement avaler l'exception.
Dans les langues où le compilateur ne se plaint pas, le vide de capture n'est généralement pas écrit du tout.
Edit: Dans la pratique, je voudrais ajouter un assert(false) dans le bloc catch. Si, théoriquement, quelque chose ne peut pas arriver, c'est un problème très sérieux quand il arrive dans la pratique ;)
Edit2: Java ne demande qu'à attraper checked exceptions. Reformulé ma déclaration un peu.