Skip to content

Commit 4279ff3

Browse files
committed
use stacktrace.fromerror for runtime error stacks
1 parent 9fbda46 commit 4279ff3

1 file changed

Lines changed: 61 additions & 58 deletions

File tree

client/utils/previewEntry.js

Lines changed: 61 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -84,29 +84,20 @@ function handleMessageEvent(e) {
8484

8585
window.addEventListener('message', handleMessageEvent);
8686

87-
// catch reference errors, via http://stackoverflow.com/a/12747364/2994108
88-
window.onerror = async function onError(
89-
msg,
90-
source,
91-
lineNumber,
92-
columnNo,
93-
error
94-
) {
95-
// maybe i can use error.stack sometime but i'm having a hard time triggering
96-
// this function
97-
let data;
98-
if (!error) {
99-
data = msg;
100-
} else {
101-
data = `${error.name}: ${error.message}`;
102-
const resolvedFileName = window.objectUrls[source];
103-
let resolvedLineNo = lineNumber;
104-
if (window.objectUrls[source] === 'index.html') {
105-
resolvedLineNo = lineNumber - htmlOffset;
87+
function formatStackLine({ fileName, functionName, lineNumber, columnNumber }) {
88+
const resolvedFileName = window.objectUrls[fileName] || fileName;
89+
const resolvedFuncName = functionName || '(anonymous function)';
90+
if (lineNumber && columnNumber) {
91+
let resolvedLineNumber = lineNumber;
92+
if (resolvedFileName === 'index.html') {
93+
resolvedLineNumber = lineNumber - htmlOffset;
10694
}
107-
const line = `\n at ${resolvedFileName}:${resolvedLineNo}:${columnNo}`;
108-
data = data.concat(line);
95+
return `\n at ${resolvedFuncName} (${resolvedFileName}:${resolvedLineNumber}:${columnNumber})`;
10996
}
97+
return `\n at ${resolvedFuncName} (${resolvedFileName})`;
98+
}
99+
100+
function postErrorMessage(data) {
110101
editor.postMessage(
111102
{
112103
source: 'sketch',
@@ -124,50 +115,62 @@ window.onerror = async function onError(
124115
},
125116
editorOrigin
126117
);
118+
}
119+
120+
// catch reference errors, via http://stackoverflow.com/a/12747364/2994108
121+
window.onerror = async function onError(
122+
msg,
123+
source,
124+
lineNumber,
125+
columnNo,
126+
error
127+
) {
128+
if (!error) {
129+
postErrorMessage(msg);
130+
return false;
131+
}
132+
let data = `${error.name}: ${error.message}`;
133+
let stackLines = [];
134+
if (error.stack) {
135+
try {
136+
stackLines = await StackTrace.fromError(error);
137+
} catch (e) {
138+
stackLines = [];
139+
}
140+
}
141+
if (stackLines.length > 0) {
142+
stackLines.forEach((stackLine) => {
143+
data = data.concat(formatStackLine(stackLine));
144+
});
145+
} else {
146+
data = data.concat(
147+
formatStackLine({
148+
fileName: source,
149+
functionName: null,
150+
lineNumber,
151+
columnNumber: columnNo
152+
})
153+
);
154+
}
155+
postErrorMessage(data);
127156
return false;
128157
};
129158
// catch rejected promises
130159
window.onunhandledrejection = async function onUnhandledRejection(event) {
131-
if (event.reason && event.reason.message) {
132-
let stackLines = [];
133-
if (event.reason.stack) {
160+
if (!event.reason || !event.reason.message) return;
161+
let stackLines = [];
162+
if (event.reason.stack) {
163+
try {
134164
stackLines = await StackTrace.fromError(event.reason);
165+
} catch (e) {
166+
stackLines = [];
135167
}
136-
let data = `${event.reason.name}: ${event.reason.message}`;
137-
stackLines.forEach((stackLine) => {
138-
const { fileName, functionName, lineNumber, columnNumber } = stackLine;
139-
const resolvedFileName = window.objectUrls[fileName] || fileName;
140-
const resolvedFuncName = functionName || '(anonymous function)';
141-
let line;
142-
if (lineNumber && columnNumber) {
143-
let resolvedLineNumber = lineNumber;
144-
if (resolvedFileName === 'index.html') {
145-
resolvedLineNumber = lineNumber - htmlOffset;
146-
}
147-
line = `\n at ${resolvedFuncName} (${resolvedFileName}:${resolvedLineNumber}:${columnNumber})`;
148-
} else {
149-
line = `\n at ${resolvedFuncName} (${resolvedFileName})`;
150-
}
151-
data = data.concat(line);
152-
});
153-
editor.postMessage(
154-
{
155-
source: 'sketch',
156-
messages: [
157-
{
158-
log: [
159-
{
160-
method: 'error',
161-
data: [data],
162-
id: Date.now().toString()
163-
}
164-
]
165-
}
166-
]
167-
},
168-
editorOrigin
169-
);
170168
}
169+
let data = `${event.reason.name}: ${event.reason.message}`;
170+
stackLines.forEach((stackLine) => {
171+
data = data.concat(formatStackLine(stackLine));
172+
});
173+
postErrorMessage(data);
171174
};
172175

173176
// Monkeypatch p5._friendlyError

0 commit comments

Comments
 (0)