查看: 3772|回复: 12

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

[复制链接]
头像被屏蔽
梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
回帖
1577

开拓者

发表于 2014-2-22 18:10:50 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
梦石
0
星屑
86
在线时间
362 小时
注册时间
2013-12-8
回帖
420
发表于 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三声。

龙→
回复

使用道具 举报

梦石
0
星屑
660
在线时间
1286 小时
注册时间
2011-6-14
回帖
3949
发表于 2014-2-22 19:30:45 | 显示全部楼层
有什么用途吗……
回复

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

发表于 2014-2-22 20:51:56 | 显示全部楼层
satgo1546 发表于 2014-2-22 19:30
有什么用途吗……


大概这样用?


某插件脚本:
[pre lang="ruby" line="1"]# 插件模组EX
module EX
# ...
def self.some_method *arg
    # do sth
    arg[2] += 1
    # do sth
  rescue
    $ex = $!
  end
# ...
end[/pre]
[pre lang="ruby" line="1"]# Game_Interpreter
# ...
   #--------------------------------------------------------------------------
  # ● 脚本
  #--------------------------------------------------------------------------
  alias :old_cmd355 :command_355
  def command_355
    old_cmd355
    reraise $ex if $ex
    $ex = nil
  end
# ...[/pre]
某事件脚本
[pre lang="ruby" line="1"]EX.some_method 1,2[/pre]
定位到 arg[2] += 1

点评

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

使用道具 举报

头像被屏蔽
梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
回帖
1577

开拓者

 楼主| 发表于 2014-2-22 21:35:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

发表于 2014-2-22 22:05:11 | 显示全部楼层
本帖最后由 余烬之中 于 2014-2-23 13:01 编辑

话说太短的话可以加功能嘛……
增强实用性 比如[pre lang="ruby" line="1"]if $RGSS_SCRIPTS[0][3].include?("8e860c510b6653364928f6adf99b3283")
  
  $RGSS_SCRIPTS.each do |s|
    s[3].gsub!("rescue!"){"rescue exstore "}
  end
  
  module Reraise
    $exstack = [] # 栈
    # 重抛出异常
    def reraise(ex)
      raise ex.class, ex.message, ex.backtrace
    end
    # 压栈
    def exstore
      $exstack.push($!)
    end
    # 退栈
    def exlast
      return true if $exstack.empty?
      reraise $exstack.pop
    end
  end
  
  include Reraise
  
else
  warning = defined?(Audio.setup_midi) ? method(:msgbox) : method(:print)
  warning.call "请将此脚本置于最顶端 → →"
end[/pre]然后测试用例[pre lang="ruby" line="1"]class TEST
  def a
    puts "a pre"
    raise NoMethodError, "A" rescue!
    puts "a done"
  end
  
  def b
    puts "b pre"
    raise NoMethodError, "B" rescue!
    puts "b done"
  end
end

t = TEST.new



#~ # 用例一
#~ puts "picnic~"
#~ t.a
#~ puts "have a break~"
#~ exlast rescue puts "a small problem...#{$!}"
#~ puts "let's go home!"

#~ puts "======================================"

#~ puts "picnic~ (2nd)"
#~ t.a
#~ puts "have a break~"
#~ exlast #rescue puts "a small problem...#{$!}"
#~ puts "let's go home! (you've got no chance!)"

# 用例二
puts "picnic~"
t.a
t.b
loop do
  (r = exlast) rescue puts "a small problem...#{$!}"
  break if r
end[/pre]
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
回帖
1577

开拓者

 楼主| 发表于 2014-2-22 22:17:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

…あたしは天

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

开拓者贵宾

发表于 2014-2-23 09:07:53 | 显示全部楼层
虽然明白是在干什么,但是总觉得没什么用……
回复

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

发表于 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
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
回帖
1577

开拓者

 楼主| 发表于 2014-2-23 13:03:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部