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



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

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

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

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

変更点
2009:11:09
・エラー落ちした場所がどこだか分らなかったバグを修正

2009:11:10
・説明文に御幣を招く表現があったので修正

2010:03:27
・評価式エラーの場合、エラーにてエラー落ちしてログが吐き出されない致命的なバグを修正

#==============================================================================
# ■ Main With エラーメッセージ外部出力 β By 貪藻矢射妥←
#------------------------------------------------------------------------------
#  各クラスの定義が終わった後、ここから実際の処理が始まります。
# 
# テストプレイなどしていてキーを連打してしまい、思わずエラーメッセージを見逃した
# という場合のためにエラーメッセージを外部に出力します。
# 
# ・・・多分、全てのエラー落ちに対してログを吐きだすことが可能なはずです。
# 
# また、バックトレースを出力することでエラー落ちした場所から更にログを遡って
# 他にどんな部分で落ちているのかを見ることが可能・・・なはずです。
# 
# ※endが1個足りない・・・とかそんなエラー落ちの場合、メッセージは外部出力
#  されません。
# 
# ※ちなみに、エラーを外部に出力することが可能になったけど、エラー落ちしたとき
#  F11でスクリプトエディタを開いた際、エラー落ちした箇所を自動で選択する機能
#  (ツクールのデフォルト)は動作しなくなっちゃいました・・・
#
# 参考文献
# http://piscis.shime-saba.com/
#
#==============================================================================
# 更新っぽいもの
# 2009:11:09
# ・エラー落ちした場所がどこだか分らなかったバグを修正
# 
# 2009:11:10
# ・説明文に御幣を招く表現があったので修正
# 
# 2010:03:27
# ・評価式エラーの場合、エラーにてエラー落ちしてログが吐き出されない致命的な
#  バグを修正

module ERROR_LOG
  # 出力ログファイル名
  LOG_FILE = "error_log.txt"
  # バックトレース情報は必要?
  NEED_BACKTRC = true
  # エラーログ出力タイプ
  # a 追記型
  # w 上書き型
  SAVE_TYPE = "a"
end

def write_error(msg)
  print(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
  # トランジション準備
  Graphics.freeze
  # シーンオブジェクト (タイトル画面) を作成
  $scene = Scene_Title.new
  # $scene が有効な限り main メソッドを呼び出す
  while $scene != nil
    $scene.main
  end
  # フェードアウト
  Graphics.transition(20)
rescue Errno::ENOENT
  # 例外 Errno::ENOENT を補足
  # ファイルがオープンできなかった場合、メッセージを表示して終了する
  filename = $!.message.sub("No such file or directory - ", "")
  
  write_error("ファイル #{filename} が見つかりません。\r\n\r\n")
  #print("ファイル #{filename} が見つかりません。")
rescue
  err_msg = []
  
  for i in 0...$@.size
    if $@[i] =~ /\(eval\)/
      err_msg[i] = "評価式エラー : " + $@[i]
    else
      id   = $@[i] =~ /Section(\d+):(\d+)/ ? $1.to_i : ""
      line = $@[i] =~ /Section(\d+):(\d+)/ ? $2.to_i : ""
      err_msg[i] = load_data("Data/Scripts.rxdata")[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 でライン移動して修正を行って下さい。

戻る