设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2793|回复: 6
打印 上一主题 下一主题

[讨论] 关于Reset异常的一点研究

[复制链接]

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

跳转到指定楼层
1
发表于 2011-5-3 14:07:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
受到紫大人的启发,手动定义一个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的容错的话 连续按几次之后会栈过深= =于是丢出到目前的这些结果来 分享一下思路

点评

我觉得有可能是这样的F12调用 raise Reset/Reset.new 可是如果我们把Reset=ArgumentError就呵呵了,于是请看代码~  发表于 2011-5-7 17:36
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

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

为什么会导致update出错?
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

3
 楼主| 发表于 2011-5-3 16:07:19 | 只看该作者
回复 yangff 的帖子

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

你可以自己试试,RumTimeError
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
4
发表于 2011-5-4 08:46:14 | 只看该作者
很有趣 =)
看来 XP 的 Hangup 也可以这样钩住。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

5
发表于 2011-5-4 21:06:58 | 只看该作者
你自己返回一个不就行了
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

6
 楼主| 发表于 2011-5-4 21:09:48 | 只看该作者
回复 yangff 的帖子

我现在就是这么做的,正常返回一个Reset的话他就正常重启了
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

7
发表于 2011-5-5 18:13:16 | 只看该作者
本帖最后由 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
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-25 02:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表