Это когда ваша программа работает с заранее неизвестными данными. Такие данные рано или поздно вызовут ошибку выполнения вашей программы. Чтобы она не завершилась аварийно, надо заворачивать код в try и обрабатывать исключение в catch. Пример - попытка чтения из файла, которого почему-то не существует.
Исключения. Допустим, пользователь вводит число и выполняет над ним арифметические операции. Если он ввел ноль и поделил на него, программа вылетит из-за необработанного исключения. Чтобы этого не произошло, блок, в котором может возникнуть такая ситуация (допустим, операция деления) мы помещаем в конструкцию try. А в catch мы помещаем набор методов и процедур для обработки возникшего исключения (например, выводим сообщение об ошибке), программа при этом не вылетит.
программа-то может быть хорошая, но глупый юзер считает каждый пиксель кнопкой и тычется туда.
ну и логика поведения у программы может быть изощрённая, которую так просто не опишешь без проверки на исключения.