Paizaスキルチェック ランタイムエラーが発生した時


Paizaスキルチェックでコード提出時に結果詳細が出るものの、テストケースで失敗した際のヒントが
「出力結果が違います」
「ランタイムエラー発生」
のみで入力例を複数自分で試した時には問題なく動いたコードが、なぜ提出時にエラーを起こすのか確かめようがないので、たまたま突破出来た際に試したこと。

例外処理を記述

複数箇所にて出力結果が異なるのであれば、条件分岐の記述漏れが可能性として高い。しかし一箇所のみエラーを起こしたのであれば、入力される値の条件が特殊な場合(境界値データ)にて発生した可能性が高い。
そこで

begin
#エラーを起こす可能性のあるコード
rescue
#例外処理
end

処理が二箇所ある場合は、二箇所とも書いた後に提出。結果が変わらなければ、前者の例外処理記述をコメントアウト、または、後者の例外処理をコメントアウトすることで、エラーが発生した位置を提出時のエラー結果で特定することができる。
この段階でランタイムエラーが「出力結果が違います」に変わったのなら、現在例外処理を記述している部分に問題があると判明しているので、rescue以降の記述を書き換える。(例えば何も入力されなかった場合は0を出力するなど)

それでも出力結果が違うと表示された場合は、rescueに何も記述しないことで例外処理を何もしないように変更。
僕の場合はこれで提出時にエラーが発生しなくなり、突破することが出来ました。

例外処理の記述で通ったのではなかった・・

ループを回す際の条件式にて、例外が起こる際の場合を考慮せずに記述していたことが原因でした。

#不完全なコード
begin
while i < count
x = gets.split(" ").map! {|i| i.to_i}
array << x
i += 1
end
rescue
end
#正しいコード
if m > 0 && n > 0
m.times do 
x = gets.split(" ").map {|i| i.to_i}
array << x
end

与えられた入力値が両方とも0であった際にエラーが起こる場合のコードですが、例外処理を記述した為に突破出来たのはrescueに何も記述していないが為にループが飛ばされ、その後の


sum = 0
p sum

本来ならばループで回した計算結果を代入するところを、ループそのものが飛ばされた為に、入力値が二つも0であれば0を表示するという結果に繋がっていただけでした。