Project1

标题: 关于Reset异常的一点研究 [打印本页]

作者: zh99998    时间: 2011-5-3 14:07
标题: 关于Reset异常的一点研究
受到紫大人的启发,手动定义一个Reset继承Exception然后抛出 能引发脚本重置
  1. class Reset < Exception
  2. end
  3. raise (Reset)
复制代码
这说明,引发脚本重置的并不是按下F12后生成的Reset中有什么特殊的指令,而是解释器在异常处理时,检测类名为Reset即进行脚本重置,意味着我们可以自己定义一个Reset对象,根据面向对象的封装原则,只要提供相同的接口即可以正常运行

首先XE一下Reset对象
  1. Reset = 1
复制代码
然后按下F12报缺少方法.new
于是
  1. Reset = Object.new
  2. def Reset.new(*args)
  3.   p args
  4. end
复制代码
p出[""] 说明F12时,传递进了一个空字符串做参数
然后报Graphics.update上发生了Runtime
因为返回值不对,原本应该返回一个Reset对象的,现在返回了nil
  1. class Reset < Exception
  2.   class << self
  3.     alias old_new new
  4.     def new(*args)
  5.       print "游戏即将重启"
  6.       old_new(*args)
  7.     end
  8.   end
  9. end
复制代码
这样再按下F12,正常提示出【游戏即将重启】 然后正常重启

由于Class#new是会调用initialize的,我们也可以把钩子写进这里面
  1. class Reset < Exception
  2.   def initialize(*args)
  3.     print "游戏即将重启"
  4.   end
  5. end
复制代码
还能否有更XE的应用呢o.o~~

尝试过直接把Reset.new定义为空之类的 试图屏蔽掉Reset,但是这么做会导致update那句出错,而再挂上update的容错的话 连续按几次之后会栈过深= =于是丢出到目前的这些结果来 分享一下思路

作者: yangff    时间: 2011-5-3 15:08
zh99998 发表于 2011-5-3 14:07
受到紫大人的启发,手动定义一个Reset继承Exception然后抛出 能引发脚本重置这说明,引发脚本重置的并不是 ...

为什么会导致update出错?
作者: zh99998    时间: 2011-5-3 16:07
回复 yangff 的帖子

在Graphics.update里检测按下F12键并进行Reset处理,原本期待Reset.new返回一个Reset实例,但是被修改了之后返回的不是那个东西,于是会出错= =

你可以自己试试,RumTimeError
作者: 苏小脉    时间: 2011-5-4 08:46
很有趣 =)
看来 XP 的 Hangup 也可以这样钩住。
作者: yangff    时间: 2011-5-4 21:06
你自己返回一个不就行了

作者: zh99998    时间: 2011-5-4 21:09
回复 yangff 的帖子

我现在就是这么做的,正常返回一个Reset的话他就正常重启了
作者: yangff    时间: 2011-5-5 18:13
本帖最后由 yangff 于 2011-5-7 17:40 编辑
zh99998 发表于 2011-5-4 21:09
回复 yangff 的帖子

我现在就是这么做的,正常返回一个Reset的话他就正常重启了 ...


Hack一下rgssxxxx看一下Reset里面还有否别的东西。。
不大清楚整个异常的流程是怎样的。
是引发reset异常然后被解释器进行处理?如果是的话。。。还是得改dll或者看看,有什么办法可以全局容错(这或在做梦)


yangff于2011-5-7 17:36补充以下内容:
class <<Graphics
  alias update_old update
  def update
    begin
      update_old
    rescue ArgumentError
      p"看,这下就没叉叉了,不过不能删掉这行我操……"
    else      
      
    ensure  
   
    end
  end
  
end

Reset=ArgumentError




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1