Re: [DISCUSSION] User-land Throwable
| From: | Rob Landers | Date: | Mon, 28 Jul 2025 12:24:11 +0000 |
| Subject: | Re: [DISCUSSION] User-land Throwable | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-128256@lists.php.net to get a copy of this message | ||
On Mon, Jul 28, 2025, at 11:41, Dmitry Derepko wrote:
> Hello PHP Internals,
>
> I would like to propose a discussion regarding two current limitations in PHP's exception
> handling system that I believe could be addressed to improve flexibility and developer experience.
>
> A few years ago I found that a library printed error traces wrong.
> After a little research I found that there was a mix of 3rd party integration error + raised
> error around the current bridge implementation (http client).
>
> There were several PHP applications with microservices architecture which I had access to
> (docker + sources).
>
> So having the message and traces I'd like to have an error chain as it can be done
> chaining several errors through a new Exception(previous: $e).
> But PHP does not allow you to manually implement Throwable. Instead you should extend
> Exception. But after that you still cannot override the getTrace() method because it's final.
>
> So my proposal is pretty simple: Remove both restrictions.
>
> 1. Allow user classes to implement Throwable interface directly
>
> User classes cannot implement the Throwable interface now.
>
> ```php
> class MyCustomThrowable implements Throwable {}
>
> // Fatal error: Class MyCustomThrowable cannot implement interface Throwable, extend Exception
> or Error instead
> ```
>
>
> 2. Make getTrace() non-final or provide alternative customization mechanism
>
>
> Exception traces cannot be overridden now.
>
> ```php
> class MyCustomThrowable extends Exception {
> function getTrace() { return []; }
> }
>
> try { throw new MyCustomThrowable(); }
> catch (Exception $e) { var_dump($e->getTrace()); }
>
> // Fatal error: Cannot override final method Exception::getTrace()
> ```
>
>
> There are some points about the feature:
>
> - Microservice support: Preserve traces across service boundaries
> - Proxy/decorator patterns: Maintain original error context through wrappers
> - Unified error handling: Any object implementing Throwable can be thrown consistently
> - Testing improvements: Create mock throwables for unit tests
> - Performance optimization: Avoid deep call stacks in generated traces
>
>
> What do you think about it? Are there disadvantages or points to have the exceptions in the
> current state?
> --
> Best regards,
> Dmitrii Derepko.
> @xepozz
Wouldn’t a better approach be to allow serializing/deserializing exceptions?
— Rob