aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Bica <cristian.bica@gmail.com>2014-08-17 23:48:44 +0300
committerAbdelkader Boudih <terminale@gmail.com>2014-08-17 23:10:45 +0000
commit3faa61ede58aa29400e4e062a799c61913ae213f (patch)
treee52f444b68d7ffa2103f0e55aa33b78e26987afe
parent9a3426220145cf8862324f204eece64f3a6a4634 (diff)
downloadrails-3faa61ede58aa29400e4e062a799c61913ae213f.tar.gz
rails-3faa61ede58aa29400e4e062a799c61913ae213f.tar.bz2
rails-3faa61ede58aa29400e4e062a799c61913ae213f.zip
[ActiveJob] raise DeserializationError when got an error deserializing
-rw-r--r--activejob/lib/active_job/arguments.rb12
-rw-r--r--activejob/test/cases/rescue_test.rb7
-rw-r--r--activejob/test/jobs/rescue_job.rb5
-rw-r--r--activejob/test/models/person.rb3
4 files changed, 27 insertions, 0 deletions
diff --git a/activejob/lib/active_job/arguments.rb b/activejob/lib/active_job/arguments.rb
index b7572b0e29..369e716912 100644
--- a/activejob/lib/active_job/arguments.rb
+++ b/activejob/lib/active_job/arguments.rb
@@ -1,4 +1,14 @@
module ActiveJob
+ class DeserializationError < StandardError
+ attr_reader :original_exception
+
+ def initialize(e)
+ super ("Error while trying to deserialize arguments: #{e.message}")
+ @original_exception = e
+ set_backtrace e.backtrace
+ end
+ end
+
module Arguments
extend self
TYPE_WHITELIST = [ NilClass, Fixnum, Float, String, TrueClass, FalseClass, Bignum ]
@@ -36,6 +46,8 @@ module ActiveJob
else
GlobalID::Locator.locate(argument) || argument
end
+ rescue => e
+ raise DeserializationError.new(e)
end
def serialize_hash_key(key)
diff --git a/activejob/test/cases/rescue_test.rb b/activejob/test/cases/rescue_test.rb
index 250ab68671..c9473314f2 100644
--- a/activejob/test/cases/rescue_test.rb
+++ b/activejob/test/cases/rescue_test.rb
@@ -20,4 +20,11 @@ class RescueTest < ActiveSupport::TestCase
job.execute(SecureRandom.uuid, "other")
end
end
+
+ test 'rescue from deserialization errors' do
+ RescueJob.enqueue Person.new(404)
+ assert_includes JobBuffer.values, 'rescued from DeserializationError'
+ assert_includes JobBuffer.values, 'DeserializationError original exception was Person::RecordNotFound'
+ assert_not_includes JobBuffer.values, 'performed beautifully'
+ end
end
diff --git a/activejob/test/jobs/rescue_job.rb b/activejob/test/jobs/rescue_job.rb
index 77084160d9..e9cb37d1c4 100644
--- a/activejob/test/jobs/rescue_job.rb
+++ b/activejob/test/jobs/rescue_job.rb
@@ -7,6 +7,11 @@ class RescueJob < ActiveJob::Base
retry_now
end
+ rescue_from(ActiveJob::DeserializationError) do |e|
+ JobBuffer.add('rescued from DeserializationError')
+ JobBuffer.add("DeserializationError original exception was #{e.original_exception.class.name}")
+ end
+
def perform(person = "david")
case person
when "david"
diff --git a/activejob/test/models/person.rb b/activejob/test/models/person.rb
index b31396db4b..76a8f40616 100644
--- a/activejob/test/models/person.rb
+++ b/activejob/test/models/person.rb
@@ -1,9 +1,12 @@
class Person
+ class RecordNotFound < StandardError; end
+
include GlobalID::Identification
attr_reader :id
def self.find(id)
+ raise RecordNotFound.new("Cannot find person with ID=404") if id.to_i==404
new(id)
end