Project1

标题: 不写RESCUE也有MESSAGE提示 [打印本页]

作者: 灵魂の补给    时间: 2011-8-17 21:21
标题: 不写RESCUE也有MESSAGE提示
begin
::
rescue
print $!.message
end
为什么不写后面的那些,也会出来错提示,是程序本身建立的么?
如果
  1. begin
  2. ::
  3. rescue
  4. print $!.message
  5. end
复制代码
而不
  1. begin
  2. ::
  3. end
复制代码
就不会显示当前出错行数。。。。
-----------------------------
另外求RESCUE求取错误脚本行数据和行数dsu_plus_rewardpost_czw
作者: fux2    时间: 2011-8-17 21:23
本来储存异常情况的就是$!和$@,捕捉到这两个变量不为空的时候可以由用户处理,而不捕捉系统则直接抛出这个异常报告.
作者: 灵魂の补给    时间: 2011-8-17 21:31
本帖最后由 灵魂の补给 于 2011-8-17 21:32 编辑
fux2 发表于 2011-8-17 21:23
本来储存异常情况的就是$!和$@,捕捉到这两个变量不为空的时候可以由用户处理,而不捕捉系统则直接抛出这个 ...


那么怎么像系统抛出异常信息那样,获取出错的脚本的哪一行
作者: fux2    时间: 2011-8-17 21:32
灵魂の补给 发表于 2011-8-17 21:31
那么怎么像系统抛出异常信息那样,获取出错的脚本的哪一行

你敢看一下Main么
作者: 灵魂の补给    时间: 2011-8-17 21:38
捕捉不到脚本出错的行数吗??
  1. #==============================================================================
  2. # ■ Main
  3. #------------------------------------------------------------------------------
  4. #  各定义结束后、从这里开始实际处理。
  5. #==============================================================================

  6. begin
  7.   # 准备过渡
  8.   # 设置系统默认字体
  9.   Font.default_name = (["黑体"])
  10.   Graphics.freeze
  11.   # 生成场景对像 (标题画面)
  12.   $scene = Scene_Title.new
  13.   # $scene 为有效的情况下调用 main 过程
  14.   while $scene != nil
  15.     $scene.main
  16.   end
  17.   # 淡入淡出
  18.   Graphics.transition(20)
  19. rescue Errno::ENOENT
  20.   # 补充 Errno::ENOENT 以外错误
  21.   # 无法打开文件的情况下、显示信息后结束
  22.   filename = $!.message.sub("No such file or directory - ", "")
  23.   print("找不到文件 #{filename}。 ")
  24. end
复制代码

作者: fux2    时间: 2011-8-17 21:50
灵魂の补给 发表于 2011-8-17 21:38
捕捉不到脚本出错的行数吗??

抛出的异常是内部抛出的,这里根本没有扑捉到
作者: orzfly    时间: 2011-8-17 22:41
本帖最后由 orzfly 于 2011-8-17 23:05 编辑

1楼中的代码之所以会报错是因为是语法错误。是解释器在解释代码的时候就遇到问题了还没有开始运行代码。
  1. begin
  2.   p nil + 1
  3. rescue
  4.   p [$!, $!.message, $!.backtrace]
  5. end
  6. exit
复制代码
试试好了。爆出来:

  1. [
  2. #<NoMethodError: undefined method `+' for nil:NilClass>,
  3. "undefined method `+' for nil:NilClass",
  4. ["Section089:2"]
  5. ]
复制代码
Section089:2 就是出错的地方了。不过只是显示成Section089,不会显示编辑器里看到的名字。这个应该是第 90 个区段……

我做了测试
  1. a = []; i = 0
  2. scripts = load_data("Data/Scripts.rxdata")
  3. scripts.each {|script|
  4.   a.push([i+=1, script[1]])
  5. }
  6. p a
复制代码
确实是第90个区段。
  1. [
  2. ....
  3. [88, "Scene_Gameover"],
  4. [89, "Scene_Debug"],
  5. [90, "TEST_SECTION"],
  6. [91, "Main"]
  7. ]
复制代码
orzfly于2011-8-17 22:48补充以下内容:
才发现$RGSS_SCRIPTS已经加载了。
楼主看这个http://rpg.blue/forum.php?mod=viewthread&tid=78782


orzfly于2011-8-17 22:56补充以下内容:
随便写了下,可以得到在什么地方出错了。
  1. begin
  2.   class A
  3.     def test
  4.       return 15 / B.new.orz
  5.     end
  6.   end
  7.   class B
  8.     def orz
  9.       return 1 + nil
  10.     end
  11.   end
  12.   return A.new.test * 5
  13. rescue
  14.   info = ""
  15.   $!.backtrace.each{ |item|
  16.     sectionno = item.sub("Section", "").split(/:/)[0].to_i
  17.     lineno = item.split(/:/)[1].to_i
  18.     method = item.split(/in `/)[1].to_s.sub("'","")
  19.     section = $RGSS_SCRIPTS[sectionno][1]
  20.     line = Zlib::Inflate.inflate($RGSS_SCRIPTS[sectionno][2]).split(/\r\n/)[lineno - 1]
  21.     info += "脚本 #{sectionno}:#{section} 第 #{lineno} 行 #{method}\n#{line} \n\n"
  22.   }
  23.   print("DAMN! #{$!.class.to_s}! #{$!.message}\n\n#{info}")
  24. end
  25. exit
复制代码
输出
  1. DAMN! TypeError! nil can't be coerced into Fixnum

  2. 脚本 89:TEST_SECTION 第 9 行 +
  3.       return 1 + nil

  4. 脚本 89:TEST_SECTION 第 9 行 orz
  5.       return 1 + nil

  6. 脚本 89:TEST_SECTION 第 4 行 test
  7.       return 15 / B.new.orz

  8. 脚本 89:TEST_SECTION 第 12 行
  9.   return A.new.test * 5
复制代码

作者: 苏小脉    时间: 2011-8-18 08:43
orzfly 发表于 2011-8-17 22:41
1楼中的代码之所以会报错是因为是语法错误。是解释器在解释代码的时候就遇到问题了还没有开始运行代码。试 ...

“解释代码”这个说法更像是运行时的行为,说”词法分析时“或”语法分析时”想来歧义更小。词法、语法分析只是纯粹的构建符号表和抽象语法树的过程,而真正执行代码的过程通常才被认为是“解释”。

呃……语法错误是捕捉不到的。

嗯,不过如果是 eval 中的语法错误,就可以被捕获。




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