ArgsManager::WriteSettingsFile throws when dynamic settings are disabled, and three call sites in NodeImpl call it without checking first. So bitcoin-qt -nosettings aborts on -resetguisettings, and on the legacy GUI settings migration when an old Qt setting is still present, which comes back on every start because the abort happens before the key is removed.
The fourth call site in that file is the wallet path in ChainImpl, and #36176 guards it. These three are the options dialog, and I ran into them while testing that PR.
The flag is easier to reach than it looks, since the fatal error box suggests -nosettings when the settings file cannot be written.
Guarding the writes on its own is not enough, because three things then happen silently instead of aborting. The migration drops the legacy keys, since it removes them whether or not the write landed. The dialog closes reporting success, since setOption only reported parse errors and QDataWidgetMapper::submit() does not propagate what setData returns. And it asks for a restart that would discard the change rather than apply it, which is reachable today without the flag.
bitcoin-qt -regtest -nosettings -resetguisettings aborts on master and starts here. The Qt tests cover the guards and each of those, with settings disabled and with a write that fails, and each one fails without its change.
The second commit reports rather than fixes the abort, so it can be dropped if reviewers would rather keep this to the crash.