Skip to content

Commit b38d450

Browse files
committed
fix: improve internal error handling
1 parent 335facf commit b38d450

3 files changed

Lines changed: 17 additions & 31 deletions

File tree

src/app.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,6 @@ export function createApp (options: AppOptions = {}): App {
5757
if (options.onError) {
5858
return options.onError(error, req, res)
5959
}
60-
// @ts-ignore
61-
if (typeof error.internal === 'undefined') {
62-
// @ts-ignore
63-
error.internal = true
64-
}
6560
return sendError(res, error, !!options.debug)
6661
})
6762
}
@@ -113,14 +108,7 @@ export function createHandle (stack: Stack): PHandle {
113108
if (layer.match && !layer.match(req.url as string, req)) {
114109
continue
115110
}
116-
let val
117-
try {
118-
val = await layer.handle(req, res)
119-
} catch (err) {
120-
if (!res.writableEnded) {
121-
return sendError(res, err, true)
122-
}
123-
}
111+
const val = await layer.handle(req, res)
124112
if (res.writableEnded) {
125113
break
126114
}
@@ -138,7 +126,7 @@ export function createHandle (stack: Stack): PHandle {
138126
}
139127
}
140128
if (!res.writableEnded) {
141-
return sendError(res, createError({ statusCode: 404, statusMessage: 'Not Found' }), false)
129+
throw createError({ statusCode: 404, statusMessage: 'Not Found' })
142130
}
143131
}
144132
}

src/error.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ import { MIMES } from './utils'
1313
*/
1414
export class H3Error extends Error {
1515
statusCode: number = 500
16-
statusMessage: string = 'Internal Error'
16+
statusMessage: string = 'H3Error'
1717
data?: any
18-
internal: boolean = false
1918
}
2019

2120
/**
@@ -30,20 +29,19 @@ export function createError (input: Partial<H3Error>): H3Error {
3029
}
3130

3231
const err = new H3Error(input.message)
33-
Error.captureStackTrace(err, createError)
3432

3533
if (input.statusCode) {
3634
err.statusCode = input.statusCode
3735
}
36+
3837
if (input.statusMessage) {
3938
err.statusMessage = input.statusMessage
4039
}
40+
4141
if (input.data) {
4242
err.data = input.data
4343
}
44-
if (input.internal) {
45-
err.internal = input.internal
46-
}
44+
4745
return err
4846
}
4947

@@ -58,11 +56,16 @@ export function createError (input: Partial<H3Error>): H3Error {
5856
* In the debug mode the stack trace of errors will be return in response.
5957
*/
6058
export function sendError (res: ServerResponse, error: Error | H3Error, debug?: boolean) {
61-
const h3Error = createError(error)
59+
let h3Error: H3Error
60+
if (error instanceof H3Error) {
61+
h3Error = error
62+
} else {
63+
console.error(error) // eslint-disable-line no-console
64+
h3Error = createError(error)
65+
}
6266

63-
// @ts-ignore
64-
if (h3Error.internal) {
65-
console.error(h3Error) // eslint-disable-line no-console
67+
if (res.writableEnded) {
68+
return
6669
}
6770

6871
res.statusCode = h3Error.statusCode

test/error.test.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,7 @@ describe('error', () => {
3232

3333
it('can send internal error', async () => {
3434
app.use('/', () => {
35-
throw createError({
36-
statusCode: 500,
37-
statusMessage: 'Internal Error',
38-
data: 'oops',
39-
internal: true
40-
})
35+
throw new Error('Booo')
4136
})
4237
const result = await request.get('/api/test')
4338

@@ -47,7 +42,7 @@ describe('error', () => {
4742

4843
expect(JSON.parse(result.text)).toMatchObject({
4944
statusCode: 500,
50-
statusMessage: 'Internal Error'
45+
statusMessage: 'H3Error'
5146
})
5247
})
5348

0 commit comments

Comments
 (0)