Issue #10504 has been updated by Nobuyoshi Nakada.

Description updated
Status changed from Open to Assigned
Assignee set to James Gray

----------------------------------------
Bug #10504: Gracefully handle CSV IO file descriptor problems
https://bugs.ruby-lang.org/issues/10504#change-49935

* Author: Jack Danger
* Status: Assigned
* Priority: Normal
* Assignee: James Gray
* Category: lib
* Target version: current: 2.2.0
* ruby -v: ruby 2.2.0dev (2014-11-13 trunk 48392) [x86_64-darwin13]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
This patch allows `CSV.open` to more gracefully handle user error. Because the IO object is passed to the user-provided block it's entirely possible the IO object can be closed before the block finishes. This would raise an error in the `ensure` clause of `CSV.open`. 

~~~diff
Index: lib/csv.rb
===================================================================
--- lib/csv.rb	(revision 48392)
+++ lib/csv.rb	(working copy)
@@ -1272,7 +1272,7 @@
       begin
         yield csv
       ensure
-        csv.close
+        csv.closed? || csv.close
       end
     else
       csv
Index: test/csv/test_interface.rb
===================================================================
--- test/csv/test_interface.rb	(revision 48392)
+++ test/csv/test_interface.rb	(working copy)
@@ -136,6 +136,14 @@
     end
   end
 
+  def test_open_handles_prematurely_closed_file_descriptor_gracefully
+    assert_nothing_raised(Exception) do
+      CSV.open(@path) do |csv|
+        csv.close
+      end
+    end
+  end
+
   ### Test Write Interface ###
 
   def test_generate
~~~

---Files--------------------------------
csv_handle_file_descriptor_gracefully.diff (783 Bytes)


-- 
https://bugs.ruby-lang.org/