Repository: pyscript/pyscript
File: pyscriptjs/src/exceptions.ts (TypeScript)

Code before:
const CLOSEBUTTON = `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill="currentColor" width="12px"><path d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/></svg>`;

type MessageType = 'text' | 'html';

/**
 * These error codes are used to identify the type of error that occurred.
 * TODO: describe in which case these are useful (or for who) as these are never used or shown.
 */
export enum ErrorCode {
    GENERIC = 'PY0000', // Use this only for development then change to a more specific error code
    FETCH_ERROR = 'PY0001',
    FETCH_NAME_ERROR = 'PY0002',
    // Currently these are created depending on error code received from fetching
    FETCH_UNAUTHORIZED_ERROR = 'PY0401',
    FETCH_FORBIDDEN_ERROR = 'PY0403',
    FETCH_NOT_FOUND_ERROR = 'PY0404',
    FETCH_SERVER_ERROR = 'PY0500',
    FETCH_UNAVAILABLE_ERROR = 'PY0503',
    BAD_CONFIG = 'PY1000',
    MICROPIP_INSTALL_ERROR = 'PY1001',
    BAD_PLUGIN_FILE_EXTENSION = 'PY2000',
    NO_DEFAULT_EXPORT = 'PY2001',
    TOP_LEVEL_AWAIT = 'PY9000',
}

export class UserError extends Error {
    /**
     * `isinstance` doesn't work correctly across multiple realms.
     * Hence, `$$isUserError` flag / marker is used to identify a `UserError`.
     */
    $$isUserError: boolean;

    constructor(public errorCode: ErrorCode, message: string, public messageType: MessageType = 'text') {

Review comment (suggestion):
You are probably not done yet. I'm just thinking out loud while I glance over the PR. Yes, we should describe the error code categories, who are these for here but also add to the docs (arguably more important actually :) )


Code after:
const CLOSEBUTTON = `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill="currentColor" width="12px"><path d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/></svg>`;

type MessageType = 'text' | 'html';

/**
 * These error codes are used to identify the type of error that occurred.
 * @see https://docs.pyscript.net/latest/reference/exceptions.html?highlight=errors
 */
export enum ErrorCode {
    GENERIC = 'PY0000', // Use this only for development then change to a more specific error code
    FETCH_ERROR = 'PY0001',
    FETCH_NAME_ERROR = 'PY0002',
    // Currently these are created depending on error code received from fetching
    FETCH_UNAUTHORIZED_ERROR = 'PY0401',
    FETCH_FORBIDDEN_ERROR = 'PY0403',
    FETCH_NOT_FOUND_ERROR = 'PY0404',
    FETCH_SERVER_ERROR = 'PY0500',
    FETCH_UNAVAILABLE_ERROR = 'PY0503',
    BAD_CONFIG = 'PY1000',
    MICROPIP_INSTALL_ERROR = 'PY1001',
    BAD_PLUGIN_FILE_EXTENSION = 'PY2000',
    NO_DEFAULT_EXPORT = 'PY2001',
    TOP_LEVEL_AWAIT = 'PY9000',
}

export class UserError extends Error {
    /**
     * `isinstance` doesn't work correctly across multiple realms.
     * Hence, `$$isUserError` flag / marker is used to identify a `UserError`.
     */
    $$isUserError: boolean;

    constructor(public errorCode: ErrorCode, message: string, public messageType: MessageType = 'text') {