2016-01-20 5 views
0

Рассмотрим Rake задачу:Rake управления исключением

namespace :foo do 
    task :bar do 
    begin 
     raise 'foo' 
    rescue RuntimeError => ex 
     raise ex.class, 'bar', ex.backtrace 
    end 
    end 
end 

Это приводит следующий вывод:

rake aborted! 
bar 
/home/vagrant/proj/lib/tasks/foo.rake:52:in `block (2 levels) in <top (required)>' 
/home/vagrant/.gem/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:268:in `load' 
/home/vagrant/.gem/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:268:in `block in load' 
/home/vagrant/.gem/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:240:in `load_dependency' 
/home/vagrant/.gem/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:268:in `load' 
-e:1:in `<main>' 
foo 
/home/vagrant/proj/lib/tasks/foo.rake:52:in `block (2 levels) in <top (required)>' 
/home/vagrant/.gem/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:268:in `load' 
/home/vagrant/.gem/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:268:in `block in load' 
/home/vagrant/.gem/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:240:in `load_dependency' 
/home/vagrant/.gem/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:268:in `load' 
-e:1:in `<main>' 
Tasks: TOP => foo:bar 
(See full trace by running task with --trace) 

Как вы можете видеть, есть и исключение оригинальный (foo), а также новый (bar). Почему? Я бы предпочел исключение foo, которое было правильно спасено, чтобы не отображаться здесь.

ответ

0

Исходное исключение не существует (foo).

Rakefile:

namespace :foo do 
    task :bar do 
    begin 
     raise "message from foo" 
    rescue RuntimeError => ex 
     puts "#{ex.message}. foo is rescued"    # <= 1st 
     raise ex.class, 'message from bar', ex.backtrace # <= 2nd 
    end 
    end 
end 

Выходные:

message from foo. foo is rescued # <= 1st 
rake aborted! 
message from bar # <= 2nd 
/home/vagrant/Rakefile:4:in `block (2 levels) in <top (required)>' 
message from foo # <= from backtrace 
/home/vagrant/Rakefile:4:in `block (2 levels) in <top (required)>' 
Tasks: TOP => foo:bar 
(See full trace by running task with --trace) 
+0

Спасибо за ваш ответ @ yhirano55. Однако, боюсь, я до сих пор не понимаю, почему сообщение первого исключения было бы в обратном направлении вообще? Насколько я знаю, это не стандартное поведение Ruby? – user4867444