From 95a8cc390cf77e3661c61968bb338d662580bf6d Mon Sep 17 00:00:00 2001 From: Pandipipas <62224708+Pandipipas@users.noreply.github.com> Date: Thu, 19 Feb 2026 14:37:50 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20mostrar=20errores=20fatales=20de=20arran?= =?UTF-8?q?que=20en=20producci=C3=B3n=20(#22)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/main.ts | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/main.ts b/src/main/main.ts index 2c72ec1..dd8e596 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, BrowserWindowConstructorOptions, shell } from "electron"; +import { app, BrowserWindow, BrowserWindowConstructorOptions, dialog, shell } from "electron"; import { ChildProcess, spawn } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; @@ -344,6 +344,28 @@ function log(...args: unknown[]): void { console.log("[scoreko-electron]", ...args); } +function formatErrorMessage(error: unknown): string { + if (error instanceof Error) { + const stack = error.stack?.trim(); + return stack && stack.length > 0 ? stack : error.message; + } + + return String(error); +} + +function showFatalError(message: string, error?: unknown): void { + const formattedError = error ? formatErrorMessage(error) : undefined; + const details = formattedError ? `${message}\n\n${formattedError}` : message; + + console.error(details); + + if (!app.isReady()) { + return; + } + + dialog.showErrorBox("Scoreko - Error al iniciar", details); +} + function getOptionalEnv(name: string): string | undefined { const value = process.env[name]?.trim(); return value && value.length > 0 ? value : undefined; @@ -380,7 +402,7 @@ app.on("ready", () => { } launch().catch(async (error: unknown) => { - console.error("Failed to launch Scoreko wrapper", error); + showFatalError("No se pudo iniciar Scoreko.", error); closeLoadingWindow(); app.exit(1); }); @@ -420,3 +442,11 @@ app.on("will-quit", () => { process.on("exit", () => { stopNodeCG(); }); + +process.on("uncaughtException", (error) => { + showFatalError("Error inesperado en el proceso principal de Electron.", error); +}); + +process.on("unhandledRejection", (reason) => { + showFatalError("Promesa no controlada en el proceso principal de Electron.", reason); +});