feat: error handler.
This commit is contained in:
parent
0dd72eef89
commit
ea07727f68
|
@ -0,0 +1,15 @@
|
||||||
|
import { ErrorHandler } from './struct/index.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {import('./struct/interface/error-handler').ErrorHandler} ErrorHandler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Record<"firefox" | "chrome" | "safari" | "other", new () => ErrorHandler>}
|
||||||
|
*/
|
||||||
|
export const errorHandlerMap = {
|
||||||
|
'chrome': ErrorHandler.ChromeErrorHandler,
|
||||||
|
'firefox': ErrorHandler.FirefoxErrorHandler,
|
||||||
|
'safari': ErrorHandler.UnknownErrorHandler,
|
||||||
|
'other': ErrorHandler.UnknownErrorHandler
|
||||||
|
};
|
|
@ -0,0 +1,45 @@
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {import('../interface/error-handler').ErrorHandler} ErrorHandler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @implements {ErrorHandler}
|
||||||
|
*/
|
||||||
|
export class ChromeErrorHandler {
|
||||||
|
#errorList;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.#errorList = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
onLoad() {
|
||||||
|
Error.prepareStackTrace = (error, stackTraces) => {
|
||||||
|
this.#errorList.push([error, stackTraces]);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {PromiseRejectionEvent} event
|
||||||
|
*/
|
||||||
|
onHandle(event) {
|
||||||
|
event.promise.catch((error) => {
|
||||||
|
const result = this.#errorList.find(savedError => savedError[0] === error);
|
||||||
|
if (result) {
|
||||||
|
// @ts-ignore
|
||||||
|
window.onerror(
|
||||||
|
result[0].message,
|
||||||
|
result[1][0].getScriptNameOrSourceURL() || void 0,
|
||||||
|
result[1][0].getLineNumber() || void 0,
|
||||||
|
result[1][0].getColumnNumber() || void 0,
|
||||||
|
result[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onErrorPrepare() {
|
||||||
|
this.#errorList.length = 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {import('../interface/error-handler').ErrorHandler} ErrorHandler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @implements {ErrorHandler}
|
||||||
|
*/
|
||||||
|
export class FirefoxErrorHandler {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {PromiseRejectionEvent} event
|
||||||
|
*/
|
||||||
|
onHandle(event) {
|
||||||
|
event.promise.catch((error) => {
|
||||||
|
if (typeof error === 'object' && error instanceof Error) {
|
||||||
|
// Firefox在大环境下默认情况必须要那么多ts-ignore
|
||||||
|
// @ts-ignore
|
||||||
|
window.onerror(
|
||||||
|
error.message,
|
||||||
|
// @ts-ignore
|
||||||
|
error.fileName,
|
||||||
|
// @ts-ignore
|
||||||
|
error.lineNumber,
|
||||||
|
// @ts-ignore
|
||||||
|
error.columnNumber,
|
||||||
|
error
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
export { ChromeErrorHandler } from './chrome.js';
|
||||||
|
export { FirefoxErrorHandler } from './firefox.js';
|
||||||
|
export { UnknownErrorHandler } from './unknown.js';
|
|
@ -0,0 +1,23 @@
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {import('../interface/error-handler').ErrorHandler} ErrorHandler
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @implements {ErrorHandler}
|
||||||
|
*/
|
||||||
|
export class UnknownErrorHandler {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {PromiseRejectionEvent} event
|
||||||
|
*/
|
||||||
|
onHandle(event) {
|
||||||
|
event.promise.catch((error) => {
|
||||||
|
if (typeof error === 'object' && error instanceof Error) {
|
||||||
|
// 非chrome和firefox就自生自灭吧
|
||||||
|
// Safari也是,反正没办法解决问题就解决提问的人
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
export * as ErrorHandler from './error-handler/index.js';
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
export interface ErrorHandler {
|
||||||
|
onLoad?(): void | Promise<void>
|
||||||
|
|
||||||
|
onHandle?(event: PromiseRejectionEvent): void | Promise<void>
|
||||||
|
|
||||||
|
onErrorPrepare?(): void
|
||||||
|
|
||||||
|
onErrorFinish?(): void
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
export { ErrorHandler } from './error-handler'
|
Loading…
Reference in New Issue