Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | 10x 10x 10x 10x 10x 18x 13x 13x 10x 6x 2x 16x 12x 9x 5x 2x 7x 6x 4x 2x 1x | import { diagnostics } from "./Diag";
import { Stack } from "./stacks";
import { Strings } from "./Strings";
let errorArray: string[] = [];
export class Errors {
public static clear(): void { errorArray = []; }
public static get() { return errorArray; }
public static add(eventName: string, stack: string[], suppressTracking: boolean): void {
if (eventName || stack) {
const stackString = Strings.joinArray(stack, "\n");
errorArray.push(Strings.joinArray([eventName, stackString], "\n"));
if (!suppressTracking) {
diagnostics.trackEvent({ name: eventName },
{
stack: stackString,
source: "Errors.add"
});
}
}
}
public static isError(error: unknown): boolean {
if (!error) return false;
// We can't afford to throw while checking if we're processing an error
// So just swallow any exception and fail.
try {
if (typeof (error) === "string") return false;
if (typeof (error) === "number") return false;
if (typeof error === "object" && "stack" in error) return true;
} catch (e) {
diagnostics.trackEvent({ name: "isError exception with error", properties: { error: JSON.stringify(e) } });
}
return false;
}
// error - an exception object
// message - a string describing the error
// suppressTracking - boolean indicating if we should suppress tracking
public static log(error: unknown, message: string, suppressTracking?: boolean): void {
if (error && !suppressTracking) {
const event = { name: "Errors.log" };
const props = {
message: message,
error: JSON.stringify(error, null, 2),
source: "",
stack: "",
description: "",
errorMessage: ""
};
if (Errors.isError(error) && (error as { exception?: unknown }).exception) {
props.source = "Error.log Exception";
event.name = "Exception";
}
else {
props.source = "Error.log Event";
if (typeof error === "object" && "description" in error) props.description = (error as { description: string }).description;
if (typeof error === "object" && "message" in error) props.errorMessage = (error as { message: string }).message;
if (typeof error === "object" && "stack" in error) props.stack = (error as { stack: string }).stack;
if (typeof error === "object" && "description" in error) {
event.name = (error as { description: string }).description;
} else if (typeof error === "object" && "message" in error) {
event.name = (error as { message: string }).message;
} else if (props.message) {
event.name = props.message;
} else {
event.name = "Unknown error object";
}
}
diagnostics.trackException(event, props);
}
Stack.parse(error, message, function (eventName: string, stack: string[]): void {
Errors.add(eventName, stack, suppressTracking ?? false);
});
}
public static logMessage(message:string): void {
Errors.add(message, [], true);
}
public static getErrorMessage(error: unknown): string {
if (!error) return "";
if (typeof (error) === "string") return error;
if (typeof (error) === "number") return error.toString();
if (typeof error === "object" && error !== null && "message" in error) return (error as Error).message;
return JSON.stringify(error, null, 2);
}
public static getErrorStack(error: unknown): string {
if (!error) return "";
if (typeof (error) === "string") return "string thrown as error";
if (typeof (error) === "number") return "number thrown as error";
if (!Errors.isError(error)) return "";
Eif (typeof error === "object" && error !== null && "stack" in error) return (error as Error).stack ?? "";
return "";
}
}
|