Я думаю, что Пол Фишер прав, но это мой первый пост, и у меня нет представителя, чтобы комментировать его ответ.
Та же теория в моих словах; Ваша вызывающая функция вызывает переполнение стека. Он помещает свои копии в стек до тех пор, пока он не окажется на относительно коротком расстоянии от конца. На некоторой "N-1" -й рекурсивной итерации вызывающей функции глубина стека вашей LogString достаточна для того, чтобы вызвать переполнение, поскольку тогда вы окажетесь на довольно коротком расстоянии от конца стека. filePathFilenameExists (), вероятно, имеет более глубокий максимальный стек, чем большинство других методов в вызывающей функции, и этого достаточно, чтобы выделить LogString как счастливчика, который ловит исключение.
Если оставить в стороне теорию, ваша проблема должна быть очевидна при выводе LogString, если он вызывается откуда-то повторно. Это и просмотр вашего стека в отладчике IDE.