How do developers structure their programs if they want to have a top-level error handling function?
The immediate thought that came into my mind was to wrap a try..catch to the main function, however, this does not trigger errors from callbacks?
JavaScript
x
17
17
1
try {
2
main();
3
} catch(error) {
4
alert(error)
5
}
6
7
function main() {
8
9
// This works
10
throw new Error('Error from main()');
11
12
document.querySelector('button').addEventListener('click', function() {
13
// This doesn throw
14
throw new Error ('Error from click callback');
15
})
16
17
}
JavaScript
1
3
1
<button>
2
Click me to see my callback error
3
</button>
Advertisement
Answer
In javascript you can override global onerror, catching most of the errors:
JavaScript
1
2
1
window.onerror = function(message, source, lineno, colno, error) { };
2
https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror
In your case:
JavaScript
1
19
19
1
window.onerror = function(message, source, lineno, colno, error) {
2
console.error(message);
3
alert(message);
4
return false
5
};
6
7
function main() {
8
9
// This works
10
throw new Error('Error from main()');
11
12
document.querySelector('button').addEventListener('click', function() {
13
// This doesn throw
14
throw new Error ('Error from click callback');
15
})
16
}
17
18
main();
19
Some extra info: https://blog.sentry.io/2016/01/04/client-javascript-reporting-window-onerror
Added after questions if Promise would raise the error, lets test:
JavaScript
1
12
12
1
window.onerror = (message, source, lineno,colno,error)=>{
2
console.error(`It does!, ${message}`);
3
};
4
const aFn = ()=>{
5
return new Promise((resolve)=>{
6
setTimeout(()=>{
7
throw new Error("whoops")
8
}, 3000);
9
});
10
}
11
aFn();
12
Result:
JavaScript
1
7
1
VM1163:2 It does!, Script error.
2
window.onerror @ VM1163:2
3
error (asynchroon)
4
(anoniem) @ VM1163:1
5
VM1163:7 Uncaught Error: whoops
6
at <anonymous>:7:19
7