Why is it possible for apollo.mutate() to throw, instead of just adding the error to the `errors` object?

I find the way the Apollo Client deals with errors a bit unwieldy, cause you have to handle errors from 2 sources: 1) actual JS Error thrown from the .mutate() call, so the invocation has to be wrapped in a try/catch 2) errors inside the errors property of the result struct.

I mean, I can understand .mutate() throwing if there’s some kind of serious logic issue in your code, but it seems to throw even if the error is a GraphQL error sent back from the server! I find myself constantly adding a .catch() onto all my .mutate() calls where I use a utility to convert any cought errors into an Apollo result struct with the error added to errors.

Something like this:

const {data, errors} = await apollo.mutate(...).catch(convertErrorToResult)

if (errors?.length) {
  // All error handling can just check `errors` now
}

So is there a reason for this? If so, can it be turned off?