substr выдает исключение вне диапазона, если его первый параметр (начальная позиция подстроки) превышает длину строки, к которой он применяется:
string s = "foo";
s.substr( 1 ); // ok
s.substr( 5 ); // exception
Итак, очевидное решение - не писать код, в котором может возникнуть второй случай.