[Ace]Отлов ошибок в скрипте, вызываемом из события

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 4 мес. назад - 10 года 4 мес. назад #88818 от Cerberus
Нередко бывало так, что скрипт, вызываемый из команды события, выдавал ошибку где-то в глубине, которую не удавалось отловить, поскольку исключение ссылалось на Game_Interpreter. Где-то, кажется, я уже видел способ это исправить, но сейчас найти не смог, поэтому решил написать нехитрый код сам.

Установка бесхитростная - plug&play.
Code:
# скопировано у DeadElf79 # код, ставящий в соответствие номеру скрипта его название scripts=load_data('Data/Scripts.rvdata2') $script_names=[] scripts.each{ |item| $script_names+=[item[1]] } # дополнение для ядра # буду признателен, если мне помогут это сделать удачнее module Kernel def err_conv(backtrace) res = "" backtrace.each {|line| line.gsub!(/\{(\d+)\}/) {|s| $script_names[$1.to_i] + " " } res += line + "\n" } return res end end #============================================================================== # ** Game_Interpreter #------------------------------------------------------------------------------ # An interpreter for executing event commands. This class is used within the # Game_Map, Game_Troop, and Game_Event classes. #============================================================================== class Game_Interpreter # специально для interpreter-а переопределяем eval alias rescued_eval eval def eval(script) script = "begin\n" + script + "\nrescue Exception=>e\n" script += "raise e.class.to_s + \"\n\" + e.message + \"\n\" + err_conv(e.backtrace)\nend" begin rescued_eval(script) rescue Exception=>e print e.message line = "Ошибка в событии #@event_id на карте #@map_id" line += ", в строке #@index\n" if $TEST line += "Проверьте консоль игры - там будут указаны детали ошибки" end raise(line) end end end #============================================================================== # ** Game_Character #------------------------------------------------------------------------------ # A character class with mainly movement route and other such processing # added. It is used as a super class of Game_Player, Game_Follower, # GameVehicle, and Game_Event. #============================================================================== class Game_Character < Game_CharacterBase # специально для interpreter-а переопределяем eval alias rescued_eval eval def eval(script) script = "begin\n" + script + "\nrescue Exception=>e\n" script += "raise e.class.to_s + \"\n\" + e.message + \"\n\" + err_conv(e.backtrace)\nend" begin rescued_eval(script) rescue Exception=>e print e.message line = "Ошибка в событии #@event_id на карте #@map_id" line += ", в строке #@index\n" if $TEST line += "Проверьте консоль игры - там будут указаны детали ошибки" end raise(line) end end end

Жуть болотная, на лапках, в тапках и с пулемётом...
Последнее редактирование: 10 года 4 мес. назад пользователем Cerberus.
Спасибо сказали: DeadElf79, strelokhalfer, Демий, EvilCat

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
Больше
10 года 4 мес. назад #89012 от strelokhalfer
Неплохо, а то ругнется на интерпретеровский eval, а ты потом думай, чтьо где и как...

"Стрелок, что-то ты неочень похож на свой аватар..."(с)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
10 года 4 мес. назад #89014 от Lekste
Ну можно же и лог открыть через F8.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 4 мес. назад #89016 от Cerberus
Лекст, какой лог при вылете Эйсовой игры? Виноват, конечно, что в заголовке не прописал...

Жуть болотная, на лапках, в тапках и с пулемётом...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
9 года 3 мес. назад #96528 от DeadElf79
Цербер, я тебя однажды покусаю. Я три часа искал ошибку деления на ноль, на которую указывал мне редактор и оббежал весь код в проекте вообще. Потом вспомнил про твой скрипт показа деталей ошибки, поставил его и понял, что он тоже не слишком помогает делу.

Но затем я добавил в твой скрипт всего пару строк и смог и ошибку найти, и решение придумать, и в деревне в огороде картошку прополоть, и даже избу себе из веников построить.

Скопирую сюда чудесный фикс, который показывает код команды, которую выполнял ивент и на которой он запоролся и параметры этой команды. Возможно, кто-нибудь не станет лениться и сделает ковертор номеров команд в названия этих самых команд, но я не стал этого делать.
Code:
# Отлов ошибок в скрипте, вызываемом из события # скопировано у DeadElf79 # код, ставящий в соответствие номеру скрипта его название scripts=load_data('Data/Scripts.rvdata2') $script_names=[] scripts.each{ |item| $script_names+=[item[1]] } # дополнение для ядра # буду признателен, если мне помогут это сделать удачнее module Kernel def err_conv(backtrace) res = "" backtrace.each {|line| line.gsub!(/\{(\d+)\}/) {|s| $script_names[$1.to_i] + " " } res += line + "\n" } return res end end #============================================================================== # ** Game_Interpreter #------------------------------------------------------------------------------ # An interpreter for executing event commands. This class is used within the # Game_Map, Game_Troop, and Game_Event classes. #============================================================================== class Game_Interpreter # специально для interpreter-а переопределяем eval alias rescued_eval eval def eval(script) script = "begin\n" + script + "\nrescue Exception=>e\n" script += "raise e.class.to_s + \"\n\" + e.message + \"\n\" + err_conv(e.backtrace)\nend" begin rescued_eval(script) rescue Exception=>e print e.message line = "Ошибка в событии #@event_id на карте #@map_id" line += ", в строке #@index\n" event_code = $game_map.events[@event_id].list[@index].code event_params = $game_map.events[@event_id].list[@index].parameters.join(", ") line += "(код команды: #{event_code}, #{event_params})\n" if $TEST line += "Проверьте консоль игры - там будут указаны детали ошибки" end raise(line) end end end #============================================================================== # ** Game_Character #------------------------------------------------------------------------------ # A character class with mainly movement route and other such processing # added. It is used as a super class of Game_Player, Game_Follower, # GameVehicle, and Game_Event. #============================================================================== class Game_Character < Game_CharacterBase # специально для interpreter-а переопределяем eval alias rescued_eval eval def eval(script) script = "begin\n" + script + "\nrescue Exception=>e\n" script += "raise e.class.to_s + \"\n\" + e.message + \"\n\" + err_conv(e.backtrace)\nend" begin rescued_eval(script) rescue Exception=>e print e.message line = "Ошибка в событии #@event_id на карте #@map_id" line += ", в строке #@index\n" event_code = $game_map.events[@event_id].list[@index].code event_params = $game_map.events[@event_id].list[@index].parameters.join(", ") line += "(код команды: #{event_code}, #{event_params})\n" if $TEST line += "Проверьте консоль игры - там будут указаны детали ошибки" end raise(line) end end end

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.091 секунд
Работает на Kunena форум