This is a design decision borrowed from Java and explained in this PHP
bug: http://bugs.php.net/bug.php?id=33407
On Mon, 2006-18-12 at 12:15 -0600, Ralph Schindler wrote:
> Yes, this is the case, the exception object will populate its internal
> members at construction time, and having been thrown makes no
> alterations to internal members. This is good b/c a trace at the time
> of construction will persist until/or when the developer wishes to
> handle it.
>
> I personally don't need line/file as much as exception type, so this has
> little affect on me. But to appease those that rely on file/line, why
> not add to methods to the Zend_Exception class (which extends exception
> and it is expected that all core exception classes derive from.
>
> class Zend_Exception extends Exception
> {
> ...
> final function getTraceLine($traceDepth = 1) { ... }
> final function getTraceFile($traceDepth = 1) { ... }
> }
>
> This will allow developers to lines and files from the trace, not the
> constructor. Bam, everyone happy ;)
>
> -ralph
>
>
> Bill Karwin wrote:
> > Okay I just tried this:
> >
> > <?php
> > function testException()
> > {
> > require_once 'Zend.php';
> > try {
> > $x = Zend::exception('Zend_Exception', 'boo!');
> > throw $x;
> > } catch (Zend_Exception $e) {
> > echo "{$e->getMessage()}\n";
> > echo "file: {$e->getFile()}\n";
> > echo "line: {$e->getLine()}\n";
> > echo "trace: {$e->getTraceAsString()}\n";
> > }
> > }
> >
> > testException();
> > ?>
> >
> >
> > The output is:
> >
> > --------
> > boo!
> > file: C:\zf\library\Zend.php
> > line: 229
> > trace: #0 C:\zf\library\testex.php(6): Zend::exception('Zend_Exception',
> > 'boo!')
> > #1 C:\zf\library\testex.php(16): testException()
> > #2 {main}
> > --------
> >
> > You're right, it isn't the line where it's thrown. It reports the file
> > and line where the exception class is instantiated, inside the
> > Zend::exception() function. But the stack trace shows where the
> > Zend::exception() function was called.
> >
> > I changed the it to the more traditional:
> >
> > throw new Zend_Exception('boo!');
> >
> > And the output changed to this:
> >
> > --------
> > boo!
> > file: C:\zf\library\testex.php
> > line: 8
> > trace: #0 C:\zf\library\testex.php(15): testException()
> > #1 {main}
> > --------
> >
> > Regarding John's suggestion: the Exception class has no methods
> > setFile() or setLine().
> >
> > Regards,
> > Bill Karwin
> >
> >
> > Darby Felton wrote:
> >> Hi all,
> >>
> >> Zend::exception() only returns an exception; it does not currently throw
> >> an exception, by design, to avoid such obfuscation:
> >>
> >> throw Zend::exception('SomeException', 'Some Message');
> >>
> >> Best regards,
> >> Darby
> >>
> >> Bill Karwin wrote:
> >>
> >>> Nico Edtinger wrote:
> >>>
> >>>> With Zend::exception() we avoid loading all those exception classes
> >>>> that are only needed if an error occurs, which should be an exception.
> >>>> So instead of loading these files or at least stat()ing it with an
> >>>> opcode cache we waste some lines in a file that's loaded anyway. That
> >>>> has nothing to do with bugs in any class.
> >>>>
> >>> But it's a good point that this method causes stack traces to become
> >>> obfuscated. It reports the __FILE__ and __LINE__ of the exception as
> >>> occurring in Zend::exception, because that's where the exception is
> >>> actually thrown.
> >>>
> >>> Regards,
> >>> Bill Karwin
> >>>
> >>>
> >>>
> >>
> >>
> >>
> >
> >
>