diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb
index c859ce8280bc6d88c7c0775acfec32a742eb593a..98087a5035e516db140e221a7d772d4296186af6 100644
--- a/lib/excelsior/import.rb
+++ b/lib/excelsior/import.rb
@@ -33,7 +33,13 @@ module Excelsior
       @rows.map.with_index do |row, i|
         attributes = map_row_values(row, @columns)
         if block_given?
-          yield attributes
+          begin
+            result = yield attributes
+            report_insert
+            result
+          rescue
+            report_failure
+          end
         else
           record = model_class.create(attributes)
           add_model_errors(record, i)
@@ -60,15 +66,23 @@ module Excelsior
 
     def add_model_errors(record, index)
       if record.errors.empty?
-        @report.inserted += 1
+        report_insert
         return
       end
 
-      @report.failed += 1
+      report_failure
 
       @errors[:model] ||= []
 
       @errors[:model] << Error.new(index + 1, record.errors.full_messages)
     end
+
+    def report_insert
+      @report.inserted += 1
+    end
+
+    def report_failure
+      @report.failed += 1
+    end
   end
 end
diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb
index 0fd4a657842279520a364d0cdb539bbdff9dd582..60f8efb0395eb3114f6218724789eddb3ee2d3a0 100644
--- a/test/excelsior_test.rb
+++ b/test/excelsior_test.rb
@@ -88,4 +88,15 @@ class ExcelsiorTest < Minitest::Test
     assert_equal 1, import.report.failed
     assert_equal 3, import.report.total
   end
+
+  def test_report_with_block
+    import = UserImport.new("test/files/missing-first-name.xlsx")
+    import.run do |v|
+      raise "failure!" if v[:first_name].nil?
+      v
+    end
+    assert_equal 2, import.report.inserted
+    assert_equal 1, import.report.failed
+    assert_equal 3, import.report.total
+  end
 end