Войти на сайт

Авторизация, ждите ...
×

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

[Ace]Отлов ошибок в скрипте, вызываемом из события 8 года 2 мес. назад #88818

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • Писатель 3 местоПрограммист JavaScript Проект месяца 2 местоПроект месяца 1 место3 место3 место ГотвПроект месяца 3 местоОрганизатор конкурсовПобедитель Сбитой кодировки2 место
Нередко бывало так, что скрипт, вызываемый из команды события, выдавал ошибку где-то в глубине, которую не удавалось отловить, поскольку исключение ссылалось на Game_Interpreter. Где-то, кажется, я уже видел способ это исправить, но сейчас найти не смог, поэтому решил написать нехитрый код сам.

Установка бесхитростная - plug&play.
# скопировано у 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
Жуть болотная, на лапках, в тапках и с пулемётом...
Последнее редактирование: 8 года 2 мес. назад от Cerberus.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DeadElf79, strelokhalfer, Демий, EvilCat

Отлов ошибок в скрипте, вызываемом из события 8 года 2 мес. назад #89012

  • strelokhalfer
  • strelokhalfer аватар
  • Вне сайта
  • Архитектор Миров
  • Знатный грамотей
  • Сообщений: 1640
  • Спасибо получено: 1078
  • ПереводчикОрганизатор конкурсов2 место Программист Ruby2 место Сбитая кодировкаДаритель Стимкея
Неплохо, а то ругнется на интерпретеровский eval, а ты потом думай, чтьо где и как...
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Администратор запретил публиковать записи гостям.

Отлов ошибок в скрипте, вызываемом из события 8 года 2 мес. назад #89014

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 911
  • Спасибо получено: 565
  • Программист RubyПрограммист JavaScript ОраторВетеранДаритель Стимкея
Ну можно же и лог открыть через F8.
Администратор запретил публиковать записи гостям.

Отлов ошибок в скрипте, вызываемом из события 8 года 2 мес. назад #89016

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • Писатель 3 местоПрограммист JavaScript Проект месяца 2 местоПроект месяца 1 место3 место3 место ГотвПроект месяца 3 местоОрганизатор конкурсовПобедитель Сбитой кодировки2 место
Лекст, какой лог при вылете Эйсовой игры? Виноват, конечно, что в заголовке не прописал...
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.

Отлов ошибок в скрипте, вызываемом из события 7 года 1 мес. назад #96528

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

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

Скопирую сюда чудесный фикс, который показывает код команды, которую выполнял ивент и на которой он запоролся и параметры этой команды. Возможно, кто-нибудь не станет лениться и сделает ковертор номеров команд в названия этих самых команд, но я не стал этого делать.
# Отлов ошибок в скрипте, вызываемом из события
 
# скопировано у 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
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.254 секунд