Project1
标题: 模拟异常重抛出 Re-raise 0.02 [打印本页]
作者: 晴兰 时间: 2014-2-22 18:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: 柍若 时间: 2014-2-22 19:23
{:2_258:}晴兰女神!
居然有沙发!!
咳…请问堆栈是什么意思?
作者: satgo1546 时间: 2014-2-22 19:30
有什么用途吗……
作者: 余烬之中 时间: 2014-2-22 20:51
satgo1546 发表于 2014-2-22 19:30
有什么用途吗……
大概这样用?
某插件脚本:
# 插件模组EX
module EX
# ...
def self.some_method *arg
# do sth
arg[2] += 1
# do sth
rescue
$ex = $!
end
# ...
end
# 插件模组EX
module EX
# ...
def self.some_method *arg
# do sth
arg[2] += 1
# do sth
rescue
$ex = $!
end
# ...
end
# Game_Interpreter
# ...
#--------------------------------------------------------------------------
# ● 脚本
#--------------------------------------------------------------------------
alias :old_cmd355 :command_355
def command_355
old_cmd355
reraise $ex if $ex
$ex = nil
end
# ...
# Game_Interpreter
# ...
#--------------------------------------------------------------------------
# ● 脚本
#--------------------------------------------------------------------------
alias :old_cmd355 :command_355
def command_355
old_cmd355
reraise $ex if $ex
$ex = nil
end
# ...
某事件脚本
定位到 arg[2] += 1
作者: 晴兰 时间: 2014-2-22 21:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: 余烬之中 时间: 2014-2-22 22:05
本帖最后由 余烬之中 于 2014-2-23 13:01 编辑
话说太短的话可以加功能嘛……
增强实用性 比如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
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
然后测试用例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
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
作者: 晴兰 时间: 2014-2-22 22:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: taroxd 时间: 2014-2-23 09:07
虽然明白是在干什么,但是总觉得没什么用……
作者: 余烬之中 时间: 2014-2-23 13:01
这个好像达不到应有的效果……- raise Exception, "" rescue;
复制代码 大概是因为Exception类的缘故 一般的异常都能捕捉 但Exception、SystemExit这样的都不会捕捉到……
于是把【rescue_save】改成了【rescue!】(这个有“于是”的关系吗 0.0
=============================
@taroxd 这个用处很大啊…………
你难道没有过事件报错,打开脚本编辑器于是跳转到【eval(script)】的经历吗……然后为了找到错误处,一个一个的设置断点→ →
尤其是那种强调功能的脚本,比强调界面的脚本更难找…………
作者: 晴兰 时间: 2014-2-23 13:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: 余烬之中 时间: 2014-2-23 13:21
晴兰 发表于 2014-2-23 13:03
其实rescue只能捕捉StandardError,所以这个例子确实有问题。。。有一个异常强度弱化:
def weaken
或许可以这样?
$RGSS_SCRIPTS.each do |s|
s[3].gsub!(/^(.*?)rescue(?::|;|d\.)/){"weaken{#{$1}} rescue expush "}
end
$RGSS_SCRIPTS.each do |s|
s[3].gsub!(/^(.*?)rescue(?::|;|d\.)/){"weaken{#{$1}} rescue expush "}
end
==========
eval有多个参数吗 我一直不知道
能不能详细的解释一下?
作者: 晴兰 时间: 2014-2-23 13:49
提示: 作者被禁止或删除 内容自动屏蔽
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |