When modules are loaded over load.php, RL ensures a valid response is made no matter what.
- Exceptions thrown by modules are caught, logged, and displayed in a JS comment on top of the response.
- RL gracefully continues to build the response for any other modules in the same request.
- The response will end with a mw.loader.state() call to inform mw.loader of any modules that failed to load.
However we don't do the same in the startup module. If the version computation fails with an exception, the entire startup module is blasted away. Only point 1 above helps us ensure the response shows the error in question, but there is no graceful recovery, no executable code is delivered at all (no mw.config, no modules registered, no sources registered, no base modules loaded, no startup.js).