diff --git a/packages/errors/src/errors/CustomErrorBase.ts b/packages/errors/src/errors/CustomErrorBase.ts index 4e8674b4dc..79ab6e302c 100644 --- a/packages/errors/src/errors/CustomErrorBase.ts +++ b/packages/errors/src/errors/CustomErrorBase.ts @@ -29,6 +29,11 @@ export class CustomErrorBase extends Error { if (isError(cause)) { assignedCause = cause; causeStr = String(cause); + + // Prefer the cause.toString, but if it's not implemented we use a nicer fallback + if (causeStr === '[object Object]') { + causeStr = `${cause.name}: ${cause.message}`; + } } else { causeStr = `unknown error '${cause}'`; } diff --git a/packages/errors/src/errors/common.test.ts b/packages/errors/src/errors/common.test.ts index 1b57be2540..dfa9743616 100644 --- a/packages/errors/src/errors/common.test.ts +++ b/packages/errors/src/errors/common.test.ts @@ -31,12 +31,26 @@ describe('common', () => { it('supports causes', () => { const cause = new Error('hello'); - for (const [name, E] of Object.entries(errors)) { + const { ForwardedError, ...otherErrors } = { ...errors }; + for (const [name, E] of Object.entries(otherErrors)) { const error = new E('abcdef', cause); expect(error.cause).toBe(cause); expect(error.toString()).toContain( `${name}: abcdef; caused by Error: hello`, ); } + + const error = new ForwardedError('abcdef', cause); + expect(error.cause).toBe(cause); + expect(error.toString()).toContain('Error: abcdef; caused by Error: hello'); + }); + + it('avoids [object Object]', () => { + const cause = { name: 'SillyError', message: 'oh no' }; + const error = new errors.ForwardedError('abcdef', cause); + expect(error.cause).toBe(cause); + expect(String(error)).toBe( + 'SillyError: abcdef; caused by SillyError: oh no', + ); }); }); diff --git a/packages/errors/src/errors/common.ts b/packages/errors/src/errors/common.ts index f9300b9371..80a3d84d82 100644 --- a/packages/errors/src/errors/common.ts +++ b/packages/errors/src/errors/common.ts @@ -86,6 +86,6 @@ export class ForwardedError extends CustomErrorBase { constructor(message: string, cause: Error | unknown) { super(message, cause); - this.name = isError(cause) ? this.constructor.name : 'Error'; + this.name = isError(cause) ? cause.name : 'Error'; } }