- Сообщений: 2269
- Спасибо получено: 1182
[Ace]Отлов ошибок в скрипте, вызываемом из события
Скрыть
Больше
10 года 4 мес. назад - 10 года 4 мес. назад #88818
от Cerberus
Жуть болотная, на лапках, в тапках и с пулемётом...
Нередко бывало так, что скрипт, вызываемый из команды события, выдавал ошибку где-то в глубине, которую не удавалось отловить, поскольку исключение ссылалось на Game_Interpreter. Где-то, кажется, я уже видел способ это исправить, но сейчас найти не смог, поэтому решил написать нехитрый код сам.
Установка бесхитростная - plug&play.
Установка бесхитростная - 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.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- strelokhalfer
-
- Не в сети
- Живу я здесь
-
- Знатный грамотей
Скрыть
Больше
- Сообщений: 1640
- Спасибо получено: 1080
10 года 4 мес. назад #89012
от strelokhalfer
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
strelokhalfer ответил в теме Отлов ошибок в скрипте, вызываемом из события
Неплохо, а то ругнется на интерпретеровский eval, а ты потом думай, чтьо где и как...
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
10 года 4 мес. назад #89014
от Lekste
Lekste ответил в теме Отлов ошибок в скрипте, вызываемом из события
Ну можно же и лог открыть через F8.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Скрыть
Больше
- Сообщений: 2269
- Спасибо получено: 1182
10 года 4 мес. назад #89016
от Cerberus
Жуть болотная, на лапках, в тапках и с пулемётом...
Cerberus ответил в теме Отлов ошибок в скрипте, вызываемом из события
Лекст, какой лог при вылете Эйсовой игры? Виноват, конечно, что в заголовке не прописал...
Жуть болотная, на лапках, в тапках и с пулемётом...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
9 года 3 мес. назад #96528
от DeadElf79
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 секунд
