V tomto článku riešim odstránenie chyby “UnhandledPromise RejectionWarning: Error: Script failed to execute, this normally means an error was thrown. Check the renderer console for the error”.
Uvedené chybové hlásenie sa v mojom prípade vyskytlo pri použití metódy executeJavaScript()
. Nižšie uvádzam príklad, ktorým je možné chybu reprodukovať.
mainWindow.webContents.on('context-menu', (e, params) => {
const selectedText = params.selectionText;
try {
mainWindow.webContents.executeJavaScript(`alert("${selectedText}")`);
} catch (error) {
console.error(error);
}
});
A tu je celé znenie chybového hlásenia.
(node:14896) UnhandledPromiseRejectionWarning: Error: Script failed to execute, this normally means an error was thrown. Check the renderer console for the error.
at node:electron/js2c/renderer_init:93:395
at EventEmitter.<anonymous> (node:electron/js2c/renderer_init:81:375)
at EventEmitter.emit (node:events:390:28)
at Object.onMessage (node:electron/js2c/renderer_init:69:833)
(Use `electron --trace-warnings ...` to show where the warning was created)
(node:14896) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
Pre odstránenie tohto problému je potrebné celý vyššie uvedený zápis ešte zabaliť do eventu dom-ready
.
mainWindow.webContents.once('dom-ready', () => {
mainWindow.webContents.on('context-menu', (e, params) => {
const selectedText = params.selectionText;
try {
mainWindow.webContents.executeJavaScript(`alert("${selectedText}")`);
} catch (error) {
console.error(error);
}
});
});
Ďalší spôsob ako vyriešiť uvedený problém je nasledujúca úprava programového kódu. Odstráni sa wrapper dom-ready
a try-catch
blok a pridá sa catch blok do executeJavaScript()
.
mainWindow.webContents.executeJavaScript(script).catch(() => {});
Celý kód bude vyzerať teda nasledovne.
mainWindow.webContents.on('context-menu', (e, params) => {
const selectedText = params.selectionText;
mainWindow.webContents.executeJavaScript(`alert("${selectedText}")`)
.catch(() => {});
});
Záver
V nasledujúcom článku sa bude opäť venovať Electronu a chybe, ktorú som nevedel niekoľko hodín vyriešiť až keď som si všimol, že som neodstránil jeden štandardný príkaz, ktorý žiaľ v tomto prípade fungoval stopercentne.