Skip to content

Commit b362466

Browse files
committed
Fixes #32 Addressed different promise rejection error types
1 parent decf78b commit b362466

File tree

6 files changed

+54
-9
lines changed

6 files changed

+54
-9
lines changed

example/browser/index.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ <h1>Error Submission</h1>
1313
<button id="throw-string-error">Throw string error</button>
1414
<button id="throw-ignored-error">Throw ignored error</button>
1515
<button onclick="throwReferenceError('function-does-exist')">Throw uncaught reference error</button>
16-
<button id="throw-jquery-ajax-error">Throw jquery ajax error</button>
16+
<button id="throw-jquery-ajax-error">Throw jQuery ajax error</button>
17+
<button id="throw-promise-unhandled-rejection">Throw promise unhandled rejection</button>
1718

1819
<h1>Log Submission</h1>
1920
<button class="submit-log">Submit log event</button>

example/browser/index.js

+23
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,29 @@ document.addEventListener("DOMContentLoaded", () => {
9595
});
9696
});
9797

98+
document
99+
.querySelector("#throw-promise-unhandled-rejection")
100+
.addEventListener("click", () => {
101+
const promiseFn = () => new Promise(function (_, reject) {
102+
switch (Math.floor(Math.random() * 4)) {
103+
case 0:
104+
reject(0);
105+
break;
106+
case 1:
107+
reject(new Error("Promise rejected error"));
108+
break;
109+
case 2:
110+
reject("Promise rejected string");
111+
break;
112+
case 3:
113+
reject();
114+
break;
115+
}
116+
});
117+
118+
promiseFn();
119+
});
120+
98121
document
99122
.querySelector("#config-settings-log")
100123
.addEventListener("click", () => {

packages/browser/src/plugins/BrowserGlobalHandlerPlugin.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {
22
ExceptionlessClient,
33
IEventPlugin,
4-
PluginContext
4+
PluginContext,
5+
toError
56
} from "@exceptionless/core";
67

78
declare let $: (document: Document) => { ajaxError: { (document: (event: Event, xhr: { responseText: string; status: number; }, settings: { data: unknown; url: string; }, error: string) => void): void; }; };
@@ -25,15 +26,16 @@ export class BrowserGlobalHandlerPlugin implements IEventPlugin {
2526
});
2627

2728
window.addEventListener("unhandledrejection", event => {
28-
let error = event.reason;
29+
let reason: unknown = event.reason;
2930
try {
30-
const reason = (<{ detail?: { reason: string} }>event).detail?.reason;
31-
if (reason) {
32-
error = reason;
31+
const detailReason = (<{ detail?: { reason: string } }>event).detail?.reason;
32+
if (detailReason) {
33+
reason = detailReason;
3334
}
3435
} catch (ex) { /* empty */ }
3536

36-
void this._client?.submitUnhandledException(error as Error, "onunhandledrejection");
37+
const error: Error = toError(reason, "Unhandled rejection")
38+
void this._client?.submitUnhandledException(error, "onunhandledrejection");
3739
});
3840

3941

packages/core/src/Utils.ts

+16
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,19 @@ export function toBoolean(input: unknown, defaultValue: boolean = false): boolea
292292

293293
return defaultValue;
294294
}
295+
296+
export function toError(errorOrMessage: unknown, defaultMessage = "Unknown Error"): Error {
297+
if (errorOrMessage === null || errorOrMessage === undefined) {
298+
return new Error(defaultMessage);
299+
}
300+
301+
if (errorOrMessage instanceof Error) {
302+
return errorOrMessage;
303+
}
304+
305+
if (typeof errorOrMessage === "string") {
306+
return new Error(errorOrMessage);
307+
}
308+
309+
return new Error(JSON.stringify(errorOrMessage) || defaultMessage);
310+
}

packages/core/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,5 @@ export {
6565
startsWith,
6666
stringify,
6767
toBoolean,
68+
toError,
6869
} from "./Utils.js";

packages/node/src/plugins/NodeGlobalHandlerPlugin.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {
22
ExceptionlessClient,
33
IEventPlugin,
4-
PluginContext
4+
PluginContext,
5+
toError
56
} from "@exceptionless/core";
67

78
export class NodeGlobalHandlerPlugin implements IEventPlugin {
@@ -23,7 +24,8 @@ export class NodeGlobalHandlerPlugin implements IEventPlugin {
2324
});
2425

2526
process.addListener("unhandledRejection", (reason: unknown | null | undefined) => {
26-
void this._client?.submitUnhandledException(<Error>reason, "unhandledRejection");
27+
const error: Error = toError(reason, "Unhandled rejection")
28+
void this._client?.submitUnhandledException(error, "unhandledRejection");
2729
});
2830

2931
return Promise.resolve();

0 commit comments

Comments
 (0)