Я обычно делаю eval'ы так, чтобы они реально возвращали true если всё ок. А уж если оно не true на выходе - могу просто вставить в сообщение об ошибке содержимое $@, ну или использую её чтобы понять, насколько критична ошибка. Я обжигался на том, что $@ была хоть и defined, но falsish, мне этого опыта хватило, чтобы относиться к содержимому чудо-переменной предельно критично и всегда исходить из того, что любой не ожидаемый мной результат из eval - это исключительная ситуация