Techioz Blog

Ruby Datetime エラー nil から String への暗黙的な変換がありません

概要

null 値で Datetime (ruby) をテストしているのですが、「TypeError: nil から String への暗黙的な変換がありません」というエラーが発生します。すでに例外が実装されているのに、コードが適切に動作しないのはなぜでしょうか。これについての説明、またはそれを取り除く方法はありますか?

      def get_parsed_datetime(raw_payload)
        parse_datetime(raw_payload[:datetime])
      rescue ArgumentError
        raise Base::UnprocessableContentError, I18n.t('invalid_datetime_error')
      end

      def parse_datetime(datetime_value)
        {
          :date => Date.parse(datetime_value).strftime('%d/%m/%Y'),
          :hour => Time.parse(datetime_value).hour
        }
      end

解決策

Date.parse(nil) と Time.parse(nil) の両方で TypeError が発生します。

get_parsed_datetime は ArgumentError のみをレスキューし、TypeError はレスキューしません。

TypeError もレスキューするバージョンは次のようになります。

def get_parsed_datetime(raw_payload)
  parse_datetime(raw_payload[:datetime])
rescue ArgumentError, TypeError
  raise Base::UnprocessableContentError, I18n.t('invalid_datetime_error')
end

または、すべての種類のエラーをレスキューするバージョンでは、StandardError をレスキューできる可能性があります。