@@ -291,33 +291,39 @@ public function saveData(ServerRequest $request, ResponseInterface $response): R
291291 foreach ($ this ->registry ->loaded () as $ name ) {
292292 $ panel = $ this ->registry ->{$ name };
293293 $ data = null ;
294+ $ handlerInstalled = false ;
294295 try {
295296 $ data = $ panel ->data ();
296297
297- // Set error handler to catch warnings/errors during serialization
298- set_error_handler (function ($ errno , $ errstr ) use ($ name ): void {
299- throw new Exception ("Serialization error in panel ' {$ name }': {$ errstr }" );
300- });
298+ // Catch only warnings/notices raised during serialization; fatals
299+ // and exceptions in __sleep/__serialize already surface as throws.
300+ set_error_handler (
301+ function ($ errno , $ errstr ) use ($ name ): bool {
302+ throw new Exception ("Serialization error in panel ' {$ name }': {$ errstr }" );
303+ },
304+ E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE ,
305+ );
306+ $ handlerInstalled = true ;
301307
302308 $ content = serialize ($ data );
303-
304- restore_error_handler ();
305309 } catch (Exception $ e ) {
306- restore_error_handler ();
307-
308310 $ errorMessage = sprintf (
309311 'Failed to serialize data for panel "%s": %s ' ,
310312 $ name ,
311313 $ e ->getMessage (),
312314 );
313315
314316 Log::warning ($ errorMessage );
315- Log::debug ('Panel data type: ' . gettype ($ data ?? null ));
317+ Log::debug ('Panel data type: ' . gettype ($ data ));
316318
317319 $ content = serialize ([
318320 'error ' => $ errorMessage ,
319321 'panel ' => $ name ,
320322 ]);
323+ } finally {
324+ if ($ handlerInstalled ) {
325+ restore_error_handler ();
326+ }
321327 }
322328 $ row ->panels [] = $ requests ->Panels ->newEntity ([
323329 'panel ' => $ name ,
0 commit comments