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

Project1

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

[通用发布] 模拟异常重抛出 Re-raise 0.02

[复制链接]
头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

跳转到指定楼层
1
发表于 2014-2-22 18:10:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽

Lv1.梦旅人

梦石
0
星屑
80
在线时间
362 小时
注册时间
2013-12-8
帖子
427
2
发表于 2014-2-22 19:23:25 | 只看该作者
{:2_258:}晴兰女神!
居然有沙发!!

咳…请问堆栈是什么意思?

点评

预设好了的……话说堆栈的出口在哪边根本没有影响啊!在逻辑上是没有左右的,只有“出入口”!画图表示一般都是把堆栈的出口画在上方的……  发表于 2014-3-1 12:27
ruby中用数组进行模拟…… 【a = [1,2,3]; b = a.pop; a.push(9);】依次是赋值、退栈和压栈,最后a是[1,2,9],b是3  发表于 2014-3-1 12:12
对于某个特定的栈 出口是不允许变化的 在左边就一直在左边 在右边就一直在右边  发表于 2014-2-23 17:11
是的 但是如果出口在左边 想拿到97就得先99 98  发表于 2014-2-23 17:11
有栈[99,98,97] 想要获得99 必须先依次拿出97 98  发表于 2014-2-23 16:46
柍念作yang三声。

龙→
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
560
在线时间
1286 小时
注册时间
2011-6-14
帖子
4086
3
发表于 2014-2-22 19:30:45 | 只看该作者
有什么用途吗……
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

4
发表于 2014-2-22 20:51:56 | 只看该作者
satgo1546 发表于 2014-2-22 19:30
有什么用途吗……


大概这样用?


某插件脚本:
RUBY 代码复制
  1. # 插件模组EX
  2. module EX
  3. # ...
  4. def self.some_method *arg
  5.     # do sth
  6.     arg[2] += 1
  7.     # do sth
  8.   rescue
  9.     $ex = $!
  10.   end
  11. # ...
  12. end

RUBY 代码复制
  1. # Game_Interpreter
  2. # ...
  3.    #--------------------------------------------------------------------------
  4.   # ● 脚本
  5.   #--------------------------------------------------------------------------
  6.   alias :old_cmd355 :command_355
  7.   def command_355
  8.     old_cmd355
  9.     reraise $ex if $ex
  10.     $ex = nil
  11.   end
  12. # ...

某事件脚本
RUBY 代码复制
  1. EX.some_method 1,2

定位到 arg[2] += 1

点评

这个堆栈的出口是在右边吗?怎么设置左右呢?还是默认就已经确定好了……?  发表于 2014-3-1 12:25
原来如此……那怎么得到一个栈呢?  发表于 2014-2-23 18:10
欸?如果出口在左边,要获得99,是不是就可以直接提出来了呢?  发表于 2014-2-23 16:55
还是不是很懂唉,是说有一串数据,只能修改它的两端或者输出两端吗?  发表于 2014-2-23 16:35
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

5
 楼主| 发表于 2014-2-22 21:35:36 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

6
发表于 2014-2-22 22:05:11 | 只看该作者
本帖最后由 余烬之中 于 2014-2-23 13:01 编辑

话说太短的话可以加功能嘛……
增强实用性 比如
RUBY 代码复制
  1. if $RGSS_SCRIPTS[0][3].include?("8e860c510b6653364928f6adf99b3283")
  2.  
  3.   $RGSS_SCRIPTS.each do |s|
  4.     s[3].gsub!("rescue!"){"rescue exstore "}
  5.   end
  6.  
  7.   module Reraise
  8.     $exstack = [] # 栈
  9.     # 重抛出异常
  10.     def reraise(ex)
  11.       raise ex.class, ex.message, ex.backtrace
  12.     end
  13.     # 压栈
  14.     def exstore
  15.       $exstack.push($!)
  16.     end
  17.     # 退栈
  18.     def exlast
  19.       return true if $exstack.empty?
  20.       reraise $exstack.pop
  21.     end
  22.   end
  23.  
  24.   include Reraise
  25.  
  26. else
  27.   warning = defined?(Audio.setup_midi) ? method(:msgbox) : method(:print)
  28.   warning.call "请将此脚本置于最顶端 → →"
  29. end
然后测试用例
RUBY 代码复制
  1. class TEST
  2.   def a
  3.     puts "a pre"
  4.     raise NoMethodError, "A" rescue!
  5.     puts "a done"
  6.   end
  7.  
  8.   def b
  9.     puts "b pre"
  10.     raise NoMethodError, "B" rescue!
  11.     puts "b done"
  12.   end
  13. end
  14.  
  15. t = TEST.new
  16.  
  17.  
  18.  
  19. #~ # 用例一
  20. #~ puts "picnic~"
  21. #~ t.a
  22. #~ puts "have a break~"
  23. #~ exlast rescue puts "a small problem...#{$!}"
  24. #~ puts "let's go home!"
  25.  
  26. #~ puts "======================================"
  27.  
  28. #~ puts "picnic~ (2nd)"
  29. #~ t.a
  30. #~ puts "have a break~"
  31. #~ exlast #rescue puts "a small problem...#{$!}"
  32. #~ puts "let's go home! (you've got no chance!)"
  33.  
  34. # 用例二
  35. puts "picnic~"
  36. t.a
  37. t.b
  38. loop do
  39.   (r = exlast) rescue puts "a small problem...#{$!}"
  40.   break if r
  41. end
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

7
 楼主| 发表于 2014-2-22 22:17:40 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

8
发表于 2014-2-23 09:07:53 | 只看该作者
虽然明白是在干什么,但是总觉得没什么用……
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

9
发表于 2014-2-23 13:01:03 | 只看该作者
这个好像达不到应有的效果……
  1. raise Exception, "" rescue;
复制代码
大概是因为Exception类的缘故  一般的异常都能捕捉 但Exception、SystemExit这样的都不会捕捉到……
于是把【rescue_save】改成了【rescue!】(这个有“于是”的关系吗 0.0

=============================
@taroxd 这个用处很大啊…………
你难道没有过事件报错,打开脚本编辑器于是跳转到【eval(script)】的经历吗……然后为了找到错误处,一个一个的设置断点→ →
尤其是那种强调功能的脚本,比强调界面的脚本更难找…………

点评

我一般把eval(script)这一行给注释掉,然后代入事件上写的脚本(如果只有一段脚本的话)  发表于 2014-2-23 14:58
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

10
 楼主| 发表于 2014-2-23 13:03:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 06:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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