rescueのとこがwhileのループ壊してるな
begin〜rescue〜endは、beginとrescueの間で起きた例外ならどこで起きたものでも補足する
落ち着いて範囲を広く取るといい

というか、begin〜rescue〜endは別に特別でもなんでもない存在だから、
普通に文法に沿って書かないと駄目だぞ