#==============================================================================
# ■ Main With エラーメッセージ外部出力 in VXA β By 貪藻矢射妥←
#------------------------------------------------------------------------------
# モジュールとクラスの定義が終わった後に実行される処理です。
#
# テストプレイなどしていてキーを連打してしまい、思わずエラーメッセージを見逃した
# という場合のためにエラーメッセージを外部に出力します。
#
# ・・・多分、全てのエラー落ちに対してログを吐きだすことが可能なはずです。
#
# また、バックトレースを出力することでエラー落ちした場所から更にログを遡って
# 他にどんな部分で落ちているのかを見ることが可能・・・なはずです。
#
# ※endが1個足りない・・・とかそんなエラー落ちの場合、メッセージは外部出力
# されません。
#
# ※ちなみに、エラーを外部に出力することが可能になったけど、エラー落ちしたとき
# F11でスクリプトエディタを開いた際、エラー落ちした箇所を自動で選択する機能
# (ツクールのデフォルト)は動作しなくなっちゃいました・・・
#
# 参考文献
# http://piscis.shime-saba.com/
#
#==============================================================================
# 更新っぽいもの
# まだなし
module ERROR_LOG
# 出力ログファイル名
LOG_FILE = "error_log.txt"
# バックトレース情報は必要?
NEED_BACKTRC = true
# エラーログ出力タイプ
# a 追記型
# w 上書き型
SAVE_TYPE = "a"
end
def write_error(msg)
msgbox(msg)
day = Time.now
dates = day.strftime("+-------------------------------------------- %A %B %d %X %Y -+\r\n")
file = File.open(ERROR_LOG::LOG_FILE, "a")
file.write(msg)
file.write(dates)
file.close
end
begin
rgss_main { SceneManager.run }
rescue Errno::ENOENT
# 例外 Errno::ENOENT を補足
# ファイルがオープンできなかった場合、メッセージを表示して終了する
filename = $!.message.sub("No such file or directory - ", "")
msgbox("ファイル #{filename} が見つかりません。")
rescue
err_msg = []
for i in 0...$@.size
if $@[i] =~ /\(eval\)/
err_msg[i] = "評価式エラー : " + $@[i]
else
id = $@[i] =~ /\{(\d+)\}:(\d+)/ ? $1.to_i : 0
line = $@[i] =~ /\{(\d+)\}:(\d+)/ ? $2.to_i : 0
err_msg[i] = load_data(FIX_PATH::PATH_DATA_RGSS)[id][1] + " : " + line.to_s + "行目"
end
if i != $@.size - 1
err_msg[i] += " : "
err_msg[i] += $@[i] =~ /`(\w+)'/ ? $1 : ""
end
end
first_err = err_msg[0] + "\r\n"
err_msg.delete_at(0)
msg = first_err + "にて #{$!.class} が発生しました。\r\n\r\n#{$!.message}\r\n\r\n"
trace = err_msg.join("\r\n")
if ERROR_LOG::NEED_BACKTRC
msg += "#{trace}\r\n\r\n"
end
write_error(msg)
end
|