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