Force closes unfortunately happens for a lot of reasons. One of these is a bug in the software or an interop problem between two implementations.
Another reason is a fee spike, I know that ldk closes the channel if the fee is not matched, core lightning disables just the channel.
Now the question is: Is the force close always necessary? Imho no, I do think that we are not mature enough at the protocol level to catch the case that we can recover and try to fix it without going on chain.
But we are currently working on warning messages, where they need some more semantics around, but there is a way to do it