RubyでPHPのエラー制御演算子(せいぎょえんざんし)(@演算子(えんざんし))のようなもの

PHPにはエラー制御演算子(せいぎょえんざんし)(@演算子(えんざんし)) というものがあり、 たとえば下記(かき)のようにすることで例外(れいがい)発生(はっせい)しなくなります。

$str = @file_get_content('hoge.txt'); // hoge.txtが存在しなくても例外は発生しない。

Rubyでも(おな)じことをやろうと(おも)った場合(ばあい)rescue をワンライナーで()けば実現可能(じつげんかのう)です。

str = File.read('hoge.txt') rescue nil

ただし、RuboCopでは警告(けいこく)発生(はっせい)するので、 Style/RescueModifier のルールを無効(むこう)にする必要(ひつよう)があります。

もちろん、プロダクトコードでは使用(しよう)すべきではないですが、RSpec(とう)では(やく)()つと(おも)います。
たとえば以下(いか)のような(かん)じです。

テスト対象(たいしょう)のコード

require 'pg'

class Sample
  class << self
    PARAM = {
      host: 'localhost',
      user: 'user',
      database: 'dbname',
      port: '5432',
      password: 'password'
    }.freeze

    def get
      conn = nil
      begin
        conn = PG::Connection.new(PARAM)
        conn.exec('SELECT * FROM users')
      ensure
        conn&.close
      end
    end
  end
end

テストコード

describe Sample do
  describe 'get' do
    subject(:get) { described_class.get }

    let(:connection) { instance_double('connection') }

    before do
      allow(PG::Connection).to receive(:new).and_return(connection)
      allow(connection).to receive(:exec).and_raise(PG::Error)
      allow(connection).to receive(:close)
    end

    context '例外発生時' do
      it 'closeが呼ばれること' do
        # ↓関数の実行だけ行い、
        get rescue nil # rubocop:disable Style/RescueModifier
        # ↓PG::Connection.close が呼ばれたかを確認する。
        expect(connection).to have_received(:close).once
      end
    end
  end
end