Browse Source

Improve error reporting on failed streams, refs #85

Jordi Boggiano 13 years ago
parent
commit
0ce44f1526
2 changed files with 18 additions and 2 deletions
  1. 7 2
      src/Monolog/Handler/StreamHandler.php
  2. 11 0
      tests/Monolog/Handler/StreamHandlerTest.php

+ 7 - 2
src/Monolog/Handler/StreamHandler.php

@@ -60,10 +60,15 @@ class StreamHandler extends AbstractProcessingHandler
             if (!$this->url) {
                 throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().');
             }
-            $this->stream = @fopen($this->url, 'a');
+            $errorMessage = null;
+            set_error_handler(function ($code, $msg) use (&$errorMessage) {
+                $errorMessage = preg_replace('{^fopen\(.*?\): }', '', $msg);
+            });
+            $this->stream = fopen($this->url, 'a');
+            restore_error_handler();
             if (!is_resource($this->stream)) {
                 $this->stream = null;
-                throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened; it may be invalid or not writable.', $this->url));
+                throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$errorMessage, $this->url));
             }
         }
         fwrite($this->stream, (string) $record['formatted']);

+ 11 - 0
tests/Monolog/Handler/StreamHandlerTest.php

@@ -74,4 +74,15 @@ class StreamHandlerTest extends TestCase
         $handler = new StreamHandler('bogus://url');
         $handler->handle($this->getRecord());
     }
+
+    /**
+     * @expectedException UnexpectedValueException
+     * @covers Monolog\Handler\StreamHandler::__construct
+     * @covers Monolog\Handler\StreamHandler::write
+     */
+    public function testWriteNonExistingResource()
+    {
+        $handler = new StreamHandler('/foo/bar/baz/'.rand(0, 10000));
+        $handler->handle($this->getRecord());
+    }
 }