查看: 1816|回复: 4

[已经解决] 【不知道能不能实现的东西】出错后记录下出错代码的位置

[复制链接]
梦石
0
星屑
170
在线时间
25 小时
注册时间
2016-6-18
回帖
47
发表于 2018-1-25 10:53:05 | 显示全部楼层 |阅读模式

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

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

×
我在main那儿搞了几个rescue以便在根目录下存储错误的原因,再回到主菜单
但是
filename = $!.message.sub("No such file or directory - ", "")
这个玩意儿只能保存下错误的内容
请问能否把“脚本xx的第xx行 发生了xxx”这句话也保存下来呢
梦石
0
星屑
1397
在线时间
185 小时
注册时间
2007-2-28
回帖
139
发表于 2018-1-25 11:55:45 | 显示全部楼层
[pre lang="ruby"]module ERRSettings
  #▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
  #请设置以下东东
  # 游戏测试的时候,是否保存错误信息?(true是false不是)
  SaveErrorData = true
  
  # 回溯跟踪错误的文件名
  BackTraceFileName = "Backtrace.txt"
  #▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
end

module RPG
  module_function
  def version
    case
      when defined? Hangup then 1.0
      else 2.0
    end
  end
  def debug?
    $TEST or $DEBUG
  end
end
class Reset < Exception
end
class ScriptInterpreter
  
  include ERRSettings
  CallSystemError = true
  def run
    Graphics.freeze
    $scene = Scene_Title.new
    $scene.main until $scene.nil?
    Graphics.transition(RPG.version == 1 ? 20 : 30)
    exit
  rescue Reset => exp
    raise
  rescue SystemExit => exp
    raise
  rescue Exception => exp
    exception(exp)
    exit
  end
  
  private

  def exception(exp)
    save_backtrace(exp) if SaveErrorData or RPG.debug?
    print(get_error_message(exp))
    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 = /^Section([0-9]+):([0-9]+)(:in `(.+)')?$/
  def self.get_backtraces(bt)
    r = []
    bt.each do |i|
      r << self.new(i)
    end
    r
  end  
  def initialize(line)
    name, @line_no, @method_name =
                                    BacktraceRegexp.match(line).to_a.values_at(1,2,4)
    @name = get_section_name(name)
  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
begin
  si = ScriptInterpreter.new
  si.run
end
[/pre]

点评

成功了,感谢!  发表于 2018-1-25 14:38
好吧是因为我原来的Main没删掉  发表于 2018-1-25 13:24
emmm加上去之后游戏要关两次才能关掉  发表于 2018-1-25 13:20

评分

参与人数 1星屑 +80 赞 +1 收起 理由
RyanBern + 80 + 1 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部