diff --git a/cli/js/console.ts b/cli/js/console.ts index 9f0ce4bd6e..e6b54d8c12 100644 --- a/cli/js/console.ts +++ b/cli/js/console.ts @@ -327,8 +327,11 @@ function createObjectString( ...args: [ConsoleContext, number, number] ): string { if (customInspect in value && typeof value[customInspect] === "function") { - return String(value[customInspect]!()); - } else if (value instanceof Error) { + try { + return String(value[customInspect]!()); + } catch {} + } + if (value instanceof Error) { return String(value.stack); } else if (Array.isArray(value)) { return createArrayString(value, ...args); diff --git a/cli/js/console_test.ts b/cli/js/console_test.ts index 903e65a82e..50fe1d66a0 100644 --- a/cli/js/console_test.ts +++ b/cli/js/console_test.ts @@ -190,6 +190,27 @@ test(function consoleTestWithCustomInspector(): void { assertEquals(stringify(new A()), "b"); }); +test(function consoleTestWithCustomInspectorError(): void { + class A { + [customInspect](): string { + throw new Error("BOOM"); + return "b"; + } + } + + assertEquals(stringify(new A()), "A {}"); + + class B { + constructor(public field: { a: string }) {} + [customInspect](): string { + return this.field.a; + } + } + + assertEquals(stringify(new B({ a: "a" })), "a"); + assertEquals(stringify(B.prototype), "{}"); +}); + test(function consoleTestWithIntegerFormatSpecifier(): void { assertEquals(stringify("%i"), "%i"); assertEquals(stringify("%i", 42.0), "42");