Как создать пользовательское исключение (включая явное управление значениями null) и сохранить все исключения в файле журнала в Rials 5.2 - PullRequest
0 голосов
/ 03 июня 2019

Прежде всего, мне нужно использовать конструкцию try-catch (begin-rescue) для отлова определенных ошибок в контроллерах для каждого метода.Прав ли я в том, что попытка ловли - это начало спасательных работ на рельсах?

Как лучше всего создавать пользовательское исключение, включая явное управление значениями null?

Каков подход для сохранения всех исключений в файле журнала?

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

  1. Как создать собственное исключение для этого случая?когда game_number равно nill
  2. Как записать эти ошибки в независимый файл журнала, используя специальную библиотеку для управления журналом (log4xxx, logging-rails, logging)?
def fizz_buzz(game_number)
    # list of the numbers, starting from @game.number
    begin
      serie_num = (game_number..Constants::LAST_NUMBER_FIZZBUZZ).to_a
    rescue StandardError => e
      print e
      # how to save this error to independent file using logging lib?
      # how using custom exception for catch errors like this - 
      # game_number = nill?
    end

    new_num = serie_num.map do |num|
      if num % 3 == 0 and num % 5 == 0
        num = 'fizzbuzz'
      elsif num % 3 == 0
        num = 'fizz'
      elsif num % 5 == 0
        num = 'buzz'
      elsif num % 3 != 0 and num % 5 != 0
        num = num
      end
    end

    return new_num.join(', ')
  end

Правильно ли использовать конструкцию begin-rescue таким образом?

Я использую следующую кодовую инструкцию в config\enviroments\development.rb для создания нового регистратора для записи в независимый файл, но получаю только почти пустой файл.

config.Logger = Logger.new(ENV["PWD"] + '/fizzbuzz_log.log')

Получил fizzbuzz_log.log вот так:

# Logfile created on 2019-06-03 11:47:36 +0200 by logger.rb/56438

Заранее спасибо.

1 Ответ

0 голосов
/ 05 июня 2019
class YourCustomError < StandardError
 attr_accessor :message

 def initialize(message)
    @message = message
 end

  def to_s
    "[#{message}] #{super}"
  end
end

Вот как создать свой собственный класс ошибок. И тогда

 begin
   serie_num = (game_number..Constants::LAST_NUMBER_FIZZBUZZ).to_a
 rescue YourCustomError => e
  #Use logging lib to log or do custom error handling
end

И в вашем пользовательском методе, когда вы считаете ошибку, сделайте это.

raise YourCustomError.new("Error Occured. Contact the System Admin") # the message can be anything specific to your business domain's problem.
...