Sowas geht im Kern etwa so: https://home.fastix.org/Tests/sysview.js.php
Wenn es echte Fehler sind musst Du natürlich über deren Behandlung in PHP in PHP nachdenken, denn es nützt Dir nur wenig, wenn PHP abbricht.
try ... catch
und natürlich die Seiten über „Fehlerbehandlung und Protokollierung“ sind Deine „Freunde“.
Was damit nicht geht: Syntax-Fehler abfangen. Du musst auf den Statuscode 500 reagieren, wenn Du das vollständig haben willst. Freilich kannst Du auf dem Server (z.B. per HTACCESS) eine spezielle Fehlerseite einrichten (von der niemand behauptet, dass es HTML sein muss, das kann also ach JSON sein) - die muss dann aber statisch sein.
Ansonsten kannst Du natürlich noch prüfen, ob JSON.decode() funktioniert und, wenn nicht, annehmen, dass Du eine Fehlermeldung hast und diese in JS eben anders behandeln…