エラーメッセージの外部出力 in VXA



テストプレイ時にキーを連打していて思わずエラー落ちダイアログを見逃してしまった!
と、そんなことありませんか!?

・・・このスクリプトでそれを回避できる・・・ような気がします。

※ちなみに、エラーを外部に出力することが可能になったけど、エラー落ちしたときF11で
 スクリプトエディタを開いた際、エラー落ちした箇所を自動で選択する機能(ツクールのデフォルト)は
 動作しなくなっちゃいました・・・

☆使い方☆
スクリプトの Main 部分を上書きしてください。

変更点
まだなし

#==============================================================================
# ■ 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
出力ログファイル名は薄緑色の部分で指定できます。
Change_Cooking_Sys : 929行目 : refresh
にて NameError が発生しました。

undefined local variable or method `total_food' for #<Window_Use_CookItem:0x9eed908>

Change_Cooking_Sys : 928行目 : each
Change_Cooking_Sys : 928行目 : refresh
Change_Cooking_Sys : 1180行目 : update_select
Change_Cooking_Sys : 1117行目 : update
Change_Cooking_Sys : 1077行目 : xrxs_mp7_main
Change_Cooking_Sys : 1071行目 : loop
Change_Cooking_Sys : 1082行目 : xrxs_mp7_main
Change_Menu_Clear : 445行目 : main
Main : 61行目

+-------------------------------------------- Wednesday November 18 21:08:03 2009 -+
こんなのがテキストファイルに書き出されます。 あとはこれをもとにスクリプトエディタを開いて CTRL+G でライン移動して修正を行って下さい。

戻る