Сабж. Когда лучше бросать исключения самому (причем здесь два варианта: с использованием своего типа либо системного), а когда уповать на рантайм?
Первый простой пример: функция f(a, b, ...), где a не может быть равно нулю (на него происходит деление). Что лучше, ввести свое исключение и бросить его, бросить исключение деления на ноль или же оставить бросание исключения системе?
Второй пример: f(a, b, ...), где a принадлежит (0, 1) {допустим мы в теле делаем log(1-a) + log(a)}. Что делать в этом случае?
Пример третий: читаем (из файла, к примеру) коллекцию данных, на которые наложены ограничения вроде тех, что есть выше. Что делать здесь?
Считаем, что все функции — часть публичного API некой библиотеки.