There are technically "infinite" different reasons it could be shown. For example a variable is unexpectedly undefined due to a bug in the code.
So the error message can't elaborate in detail exactly what's wrong or why it happened or what to do about it, or whether trying again will help or not, etc...
Behind the scenes (hopefully) the actual error is captured and logged for further inspection.
In other words the end user will see a generic and friendly error message but behind the scenes the developers will see the actual code error along with other information such as a stacktrace to show how the code reached the path where the error happened.