MISC: Add more error info to error dialog and tail log (#1813)

This commit is contained in:
catloversg
2025-01-09 09:22:13 +07:00
committed by GitHub
parent 1cb2a83b4f
commit 5b6380a5c3
3 changed files with 25 additions and 4 deletions

View File

@@ -37,6 +37,7 @@ import { CompleteRunOptions, getRunningScriptsByArgs } from "./Netscript/Netscri
import { handleUnknownError } from "./utils/ErrorHandler";
import { isLegacyScript, legacyScriptExtension, resolveScriptFilePath, ScriptFilePath } from "./Paths/ScriptFilePath";
import { root } from "./Paths/Directory";
import { getErrorMessageWithStackAndCause } from "./utils/ErrorHelper";
import { exceptionAlert } from "./utils/helpers/exceptionAlert";
export const NetscriptPorts = new Map<PortNumber, Port>();
@@ -349,10 +350,14 @@ Otherwise, this can also occur if you have attempted to launch a script from a t
killWorkerScript(workerScript);
workerScript.log("", () => "Script finished running");
})
.catch(function (e) {
handleUnknownError(e, workerScript);
.catch(function (error) {
handleUnknownError(error, workerScript);
killWorkerScript(workerScript);
workerScript.log("", () => (e instanceof ScriptDeath ? "Script killed." : "Script crashed due to an error."));
workerScript.log("", () =>
error instanceof ScriptDeath
? "Script killed."
: getErrorMessageWithStackAndCause(error, "Script crashed due to an error: "),
);
})
.finally(() => {
// The earnings are transferred to the parent if it still exists.

View File

@@ -2,6 +2,7 @@ import { basicErrorMessage } from "../Netscript/ErrorMessages";
import { ScriptDeath } from "../Netscript/ScriptDeath";
import type { WorkerScript } from "../Netscript/WorkerScript";
import { dialogBoxCreate } from "../ui/React/DialogBox";
import { getErrorMessageWithStackAndCause } from "./ErrorHelper";
/** Generate an error dialog when workerscript is known */
export function handleUnknownError(e: unknown, ws: WorkerScript | null = null, initialText = "") {
@@ -18,7 +19,7 @@ export function handleUnknownError(e: unknown, ws: WorkerScript | null = null, i
} else if (e instanceof Error) {
// Ignore any cancellation errors from Monaco that get here
if (e.name === "Canceled" && e.message === "Canceled") return;
const msg = `${e.message}${e.stack ? `\nstack:\n${e.stack.toString()}` : ""}`;
const msg = getErrorMessageWithStackAndCause(e);
e = ws ? basicErrorMessage(ws, msg) : `RUNTIME ERROR:\n\n${msg}`;
}
if (typeof e !== "string") {

View File

@@ -81,6 +81,21 @@ export function parseUnknownError(error: unknown): {
};
}
export function getErrorMessageWithStackAndCause(error: unknown, prefix = ""): string {
const errorData = parseUnknownError(error);
let errorMessage = `${prefix}${errorData.errorAsString}`;
if (errorData.stack) {
errorMessage += `\nStack: ${errorData.stack}`;
}
if (errorData.causeAsString) {
errorMessage += `\nError cause: ${errorData.causeAsString}`;
if (errorData.causeStack) {
errorMessage += `\nCause stack: ${errorData.causeStack}`;
}
}
return errorMessage;
}
export function getErrorMetadata(error: unknown, errorInfo?: React.ErrorInfo, page?: Page): IErrorMetadata {
const isElectron = navigator.userAgent.toLowerCase().includes(" electron/");
const env = process.env.NODE_ENV === "development" ? GameEnv.Development : GameEnv.Production;