The difference between the error-reporting mechanisms of std::from_chars and fs::file_size is a difference in their intrinsic complexity. from_chars can fail in exactly two ways-- either the given string had no initial string of digits at all, else there were so many digits that it would cause an overflow to read them all. In the former case, a classic (but inefficient and, generally, dangerous) way to report the error would be to set errno to EINVAL (and return some useless value such as 0). In the latter case, a classic approach would be to set errno to ERANGE (and return some useless value). This is more or less (but rather less than more) the approach taken by strtol.
The salient point is that with from_chars, there ...