@@ -286,33 +286,40 @@ public function saveData(ServerRequest $request, ResponseInterface $response): R
286286
287287 foreach ($ this ->registry ->loaded () as $ name ) {
288288 $ panel = $ this ->registry ->{$ name };
289+ $ data = null ;
290+ $ handlerInstalled = false ;
289291 try {
290292 $ data = $ panel ->data ();
291293
292- // Set error handler to catch warnings/errors during serialization
293- set_error_handler (function ($ errno , $ errstr ) use ($ name ): void {
294- throw new Exception (sprintf ("Serialization error in panel '%s': %s " , $ name , $ errstr ));
295- });
294+ // Catch only warnings/notices raised during serialization; fatals
295+ // and exceptions in __sleep/__serialize already surface as throws.
296+ set_error_handler (
297+ function ($ errno , $ errstr ) use ($ name ): bool {
298+ throw new Exception ("Serialization error in panel ' {$ name }': {$ errstr }" );
299+ },
300+ E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE ,
301+ );
302+ $ handlerInstalled = true ;
296303
297304 $ content = serialize ($ data );
298-
299- restore_error_handler ();
300305 } catch (Exception $ e ) {
301- restore_error_handler ();
302-
303306 $ errorMessage = sprintf (
304307 'Failed to serialize data for panel "%s": %s ' ,
305308 $ name ,
306309 $ e ->getMessage (),
307310 );
308311
309312 Log::warning ($ errorMessage );
310- Log::debug ('Panel data type: ' . gettype ($ data ?? null ));
313+ Log::debug ('Panel data type: ' . gettype ($ data ));
311314
312315 $ content = serialize ([
313316 'error ' => $ errorMessage ,
314317 'panel ' => $ name ,
315318 ]);
319+ } finally {
320+ if ($ handlerInstalled ) {
321+ restore_error_handler ();
322+ }
316323 }
317324 $ row ->panels [] = $ requests ->Panels ->newEntity ([
318325 'panel ' => $ name ,
0 commit comments