Repository: next.js
Issue: app.prepare() failure crash the program but error message hidden
Labels: bug

### Verify canary release

- [X] I verified that the issue exists in the latest Next.js canary release

### Provide environment information

```bash
➜  courses git:(express-next-gatsby-mvp) ✗ npx --no-install next info

    Operating System:
      Platform: linux
      Arch: x64
      Version: #1 SMP Fri Jan 27 02:56:13 UTC 2023
    Binaries:
      Node: 18.14.2
      npm: 9.5.0
      Yarn: 1.22.19
      pnpm: 7.18.2
    Relevant packages:
      next: 13.2.4
      eslint-config-next: 13.2.4
      react: 18.2.0
      react-dom: 18.2.0

warn  - Latest canary version not detected, detected: "13.2.4", newest: "13.2.5-canary.4".
        Please try the latest canary version (`npm install next@canary`) to confirm the issue still exists before creating a new issue.
        Read more - https://nextjs.org/docs/messages/opening-an-issue
```


### Which area(s) of Next.js are affected? (leave empty if unsure)

_No response_

### Link to the code that reproduces this issue

https://stackblitz.com/edit/vercel-next-js-z4hyvr?file=README.md,server.js,package.json,app%2Fpage.tsx,next.config.js,server-try-catch.js

### To Reproduce

Run the project with scripts `"dev": "node server.js"` and `"dev-try-catch": "node server-try-catch.js"`

Theoretically, both custom servers should crash in the same way but don't

### Describe the Bug

When using await on `app.prepare()`, the server doesn't start, but also, and the error message is hidden, which is very confusing about the reasons it is crashing. to make the output error clear, the `app.prepare()` must be wrapped in a try-catch block using console.log().

This is inconvenient since both await and all try catch versions should behave similarly and print an error.

using only await, `throw err` and `throw new Error(err)`  don't print the error message

```js
  try {
    await app.prepare();
  } catch (err) {
    throw err // throw new Error(err) also not work
  }
```

```js
await app.prepare();
```

output:

```bash
~/projects/vercel-next-js-z4hyvr 12s❯ npm run dev
...

success Saved lockfile "package-lock.json"
success Updated "package.json"

success Install finished in 0.059s
```
  
Only when the `try-catch` contains a `console.error()` the error message is printed
  
```js
  try {
    await app.prepare();
  } catch (err) {
    console.error(err);
    process.exit(1);
  }
```
output:

```bash
~/projects/vercel-next-js-z4hyvr 12s ❯ npm run dev-try-catch
...

success Saved lockfile "package-lock.json"
success Updated "package.json"

success Install finished in 0.062s
$ node server-try-catch.js
Error: > The `app` directory is experimental. To enable, add `appDir: true` to your `next.config.js` configuration under `experimental`. See https://nextjs.org/docs/messages/experimental-app-dir-config
    at Object.findPagesDir (file:///home/projects/vercel-next-js-z4hyvr/node_modules/next/dist/lib/find-pages-dir.js:80:19)
    at DevServer.getRoutes (file:///home/projects/vercel-next-js-z4hyvr/node_modules/next/dist/server/dev/next-dev-server.js:138:59)
    at new Server (file:///home/projects/vercel-next-js-z4hyvr/node_modules/next/dist/server/base-server.js:108:47)
    at new NextNodeServer (file:///home/projects/vercel-next-js-z4hyvr/node_modules/next/dist/server/next-server.js:70:9)
    at new DevServer (file:///home/projects/vercel-next-js-z4hyvr/node_modules/next/dist/server/dev/next-dev-server.js:97:9)
    at NextServer.createServer (file:///home/projects/vercel-next-js-z4hyvr/node_modules/next/dist/server/next.js:144:20)
    at eval (file:///home/projects/vercel-next-js-z4hyvr/node_modules/next/dist/server/next.js:159:42)
    at async NextServer.prepare (file:///home/projects/vercel-next-js-z4hyvr/node_modules/next/dist/server/next.js:134:24)
    at async startNext (file:///home/projects/vercel-next-js-z4hyvr/server-try-catch.js:14:5)

```





### Expected Behavior

`await app.prepare();` should crash with a proper error message.

try-catch blocks using  `throw err` and `throw new Error(err)`  should print an error message

### Which browser are you using? (if relevant)

_No response_

### How are you deploying your application? (if relevant)

_No response_