Как я могу обрабатывать исключения точно таким же образом для набора методов? - PullRequest
0 голосов
/ 03 июня 2011

Я создаю библиотеку API-оболочек. Существует множество методов, которые являются простыми «получателями», которые входят в определенные хэши и извлекают строки.

Для всего этого может быть хэш nil или какая-то другая проблема с данными (не сетевые проблемы, я их решаю в другом месте). Если возникает такая проблема, я хочу вызвать исключение DataError, а затем обработать эти исключения в пользовательском интерфейсе. Итак, у меня есть метод handle_data_error, который принимает блок, и если блок вызывает ошибку, я ловлю его и поднимаю DataError.

Есть ли способ элегантно обернуть все содержимое набора методов в этом методе, не вводя его туда 15 раз? Любой способ сказать классу "обрабатывать ошибки такого рода"? Мне приходит в голову, может быть, я должен посмотреть на реализацию Rails 'rescue_from.

Ответы [ 3 ]

1 голос
/ 04 июня 2011

Если вы хотите вернуть DataError, когда hash не хватает key, вы можете сделать:

hash.fetch(key, DataError.new)
1 голос
/ 04 июня 2011

Если вы хотите обработать ошибку централизованно, возможно, ваши методы не должны выдавать ошибку, вместо этого перехватывать ошибки и переносить их, например, до

  • центральный слушатель, который принимает ошибки и отправляет их, или
  • обработчик, который делает что-то на основании ошибки ...
0 голосов
/ 04 июня 2011

rescue_from работает только в контроллерах.

Если у вас много похожих методов, вы можете реорганизовать их для вызова общего базового метода, где вы обрабатываете ошибки:

class Foo
  def m1
    m 1
  end

  def m2
    m 2
  end

  def m(arg)
    begin
      # try
    rescue
      # handle error
    end
  end
end

или используйте method_missing для обработки всех этих вызовов методов и обработки ошибок там:

class Foo
  def method_missing(method, *args, block)
    (super and return) unless method =~ /whatever/
    begin
      #try
    rescue
      # handle error
    end
  end
end
...