查看: 3427|回复: 2

[RMVA发布] 【VA】错误脚本详细提示和添加错误日志

[复制链接]

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
发表于 2015-10-20 23:57:41 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 寒冷魔王 于 2017-1-14 23:10 编辑

XP时代一直使用柳大大的‘错误脚本详细提示和添加错误日志’脚本,非常好用。
刚刚用VA发现不能用,于是在柳大大的基础上稍作修改,让VA可以顺利通行。
VA和前版不同之处在于Scene和异常信息exp.backtrace的不同。
本人只是稍作修改,本体完全是柳大大的。
本人非常喜欢这段脚本。希望柳大大的这段脚本能够长久伴随我们。
不知道有没有人发过这个,在这里发布一下。
首先膜拜柳大大:
{:2_259:}
@柳之一  

柳大大的帖子地址:
https://rpg.blue/thread-78782-1-1.html

[pre lang="ruby"]#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
# 本脚本原作者“柳之一”,用于XP与VX的‘错误脚本详细提示和添加错误日志’。
# 本脚本由“寒冷魔王(Chill)”修改为VA版。标记## Chill的为修改处。

module ERRSettings
#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
#请设置以下东东
# 游戏测试的时候,是否保存错误信息?(true是false不是)
SaveErrorData = false

# 回溯跟踪错误的文件名
BackTraceFileName = "Backtrace.txt"

# 触发系统错误
CallSystemError = false
#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
end

module RPG
module_function
def version
   3.0 ## Chill
end
def debug?
   $TEST ## Chill
end
end
class Reset < Exception
end
class ScriptInterpreter

include ERRSettings
def run
   SceneManager.run ## Chill
rescue RGSSReset => exp ## Chill
   raise
rescue SystemExit => exp
   raise
rescue Exception => exp
   exception(exp)
   exit
end

private

def exception(exp)
   save_backtrace(exp) if SaveErrorData or RPG.debug?
   msgbox(get_error_message(exp)) ## Chill
   raise if CallSystemError and RPG.debug?
end

def get_error_message(exp)
   if RPG.debug?
     bt = BackTrace.get_backtraces(exp.backtrace)
     
     if exp.class.to_s=="SyntaxError"
       $outexp="语法错误"
     elsif exp.class.to_s=="NameError"
       $outexp="变量未定义"
     elsif exp.class.to_s=="NoMethodError"
       $outexp="方法未定义"
     elsif exp.class.to_s=="NoMemoryError"
       $outexp="内存占有过大"
     elsif exp.class.to_s=="ArgumentError"
       $outexp="参数错误"   #如果愿意此处可以自定义添加
     else
       $outexp=exp.class.to_s
     end

     msg  = "◆ 发生错误\n"
     msg += "\n66RPG提醒您:请养成备份游戏文件的习惯。\n \n"
     msg += "错误类型 :\n\t#{$outexp}\n"
     msg += "错误信息 :\n\t#{exp.message}\n" if exp.message
     msg += "错误可能发生的相关位置 :"
     bt.each do |i|
       msg += " \n\t#{i.name} : 第 #{i.line_no} 行"
       msg += " : #{i.method_name}" if i.method_name
     end
     msg += "  \n非常荣幸能为您发送错误报告\n"
   else
     msg  = "内部发生错误强制结束。\n"
     msg += "66RPG提醒您:请养成备份游戏文件的习惯。\n"
     msg += "▲错误报告文件「#{BackTraceFileName}」已经保存。\n\n"
     msg += "  非常荣幸能为您发送错误报告\n"
   end
   msg
end

def save_backtrace(exp)
   bt = BackTrace.get_backtraces(exp.backtrace)
     if exp.class.to_s=="SyntaxError"
       $outexp="语法错误"
     elsif exp.class.to_s=="NameError"
       $outexp="变量未定义"
     elsif exp.class.to_s=="NoMethodError"
       $outexp="方法未定义"
     elsif exp.class.to_s=="NoMemoryError"
       $outexp="内存占有过大"
     elsif exp.class.to_s=="ArgumentError"
       $outexp="参数错误"   #如果愿意此处可以自定义添加
     else
       $outexp=exp.class.to_s
     end
   
   msg  = "◆ #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}\n"
   msg += "错误类型 :\n\t#{$outexp}\n"
   msg += "错误信息 :\n\t#{exp.message}\n" if exp.message
   msg += "错误可能发生的相关位置 :"
   bt.each do |i|
     msg += " \n\t#{i.name} : 第 #{i.line_no} 行"
     msg += " : #{i.method_name}" if i.method_name
   end
   msg += "\n-------------66RPG-------------------\n"
   File.open(BackTraceFileName, "a") do |file|
     file.write(msg)
   end
end
end

# 回溯跟踪错误的类
class BackTrace  
  BacktraceRegexp  = /^{([0-9]+)}:([0-9]+)(:in `(.+)')?$/  ## Chill
  BacktraceRegexp2 = /^(\(eval\)):([0-9]+)(:in `(.+)')?$/  ## Chill
  BacktraceRegexp3 = /^(.*):([0-9]+)(:in `(.+)')?$/        ## Chill
  def self.get_backtraces(bt)
    r = []
    bt.each do |i|
      r << self.new(i)
    end
    r
  end  
  def initialize(line)
    ## Chill 以下
    if ((mat = BacktraceRegexp.match(line)))
      name, @line_no, @method_name = mat.to_a.values_at(1,2,4)
      @name = get_section_name(name)
    elsif ((mat = BacktraceRegexp2.match(line)))
      name, @line_no, @method_name = mat.to_a.values_at(1,2,4)
      @name = "eval"
    elsif ((mat = BacktraceRegexp3.match(line)))
      name, @line_no, @method_name = mat.to_a.values_at(1,2,4)
      @name = name
    end
    ## Chill 以上
  end
  attr_accessor :name
  attr_accessor :line_no
  attr_accessor :method_name  
  private
  def get_section_name(index)
    $RGSS_SCRIPTS[index.to_i][1]
  end
end

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================[/pre]
梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-10-25 10:27:06 | 显示全部楼层
看了一下。。。就是说以后弹错还会显示中文?

点评

我用的另外一个···有一段通用部分,然后根据版本放不同的后续部分···  发表于 2015-10-27 22:17
_(:зゝ∠)_你没用过前版??  发表于 2015-10-25 15:02
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-10-27 07:15:09 | 显示全部楼层
很棒。RM报错没有backtrace确实很蛋疼。
然而现在我在玩MV
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部