Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

syntax error, unexpected keyword_rescue, expecting keyword_end

Tags:

ruby

rubocop

I have the following ruby code:

  EmailTemplate.for(mailer).each do |template|
    begin
      print '.'
      template.upload(publish)
    rescue Mandrill::UnknownTemplateError
      failed.push(mailer)
    end
  end

Rubocop corrected my code to:

EmailTemplate.for(mailer).each do |template|
    print '.'
    template.upload(publish)
  rescue Mandrill::UnknownTemplateError
    failed.push(mailer)
  end

and now it returns following error:

syntax error, unexpected keyword_rescue, expecting keyword_end

How can I fix that?

Rubocop warnings was:

C: Style/RedundantBegin: Redundant begin block detected.
like image 934
Mateusz Urbański Avatar asked Aug 07 '18 11:08

Mateusz Urbański


2 Answers

Ruby 2.5.0 added a feature:

rescue/else/ensure are now allowed to be used directly with do/end blocks. [Feature #12906]

But before that, it was not allowed. So syntax error will be there.

Lets do syntax test for the code in sample.rb:

[].each do |a|
  # ops
  rescue Exception => ex
  puts ex.inspect
end

From terminal:

Ruby$ ruby -c sample.rb
sample.rb:3: syntax error, unexpected keyword_rescue
  rescue Exception => ex
        ^
sample.rb:5: syntax error, unexpected keyword_end, expecting end-of-input
Ruby$ rvm use 2.5.1
Using /Users/aruprakshit/.rvm/gems/ruby-2.5.1
Ruby$ ruby -c sample.rb
Syntax OK

See the News. So before 2.5.0, you need to write it like:

[].each do |a|
  begin
    # ops
  rescue => Exception
    puts ex.inspect
  end
end

You can configure Rubocop to select the version of Ruby you want by following Setting the target Ruby version.

Some checks are dependent on the version of the Ruby interpreter which the inspected code must run on. For example, enforcing using Ruby 2.3+ safe navigation operator rather than try can help make your code shorter and more consistent... unless it must run on Ruby 2.2.

If .ruby-version exists in the directory RuboCop is invoked in, RuboCop will use the version specified by it. Otherwise, users may let RuboCop know the oldest version of Ruby which your project supports with:

AllCops:
  TargetRubyVersion: 2.4
like image 196
Arup Rakshit Avatar answered Nov 09 '22 21:11

Arup Rakshit


For some reason, Rubocop thinks you're running Ruby 2.5, not Ruby 2.4.1.

You can fix this one of two ways:

1) Create a file .ruby-version with content 2.4.1. Rubocop should pick up your Ruby version from this file.
2) Add the following to your .rubocop.yml:

AllCops:
  TargetRubyVersion: 2.4
like image 39
Nils Landt Avatar answered Nov 09 '22 21:11

Nils Landt