1.0.31 • Published 5 years ago

class-error-catch v1.0.31

Weekly downloads
3
License
MIT
Repository
github
Last release
5 years ago

基于 decorator 的错误捕捉
支持方法,getter,class

Installation

Node

npm install class-error-catch --save

Options

createCatchError supports the following options:

  • errorHandler: 错误处理函数
    默认处理函数如下
/**
 * 默认错误处理函数
 * @param {Error} err  错误信息
 * @param {Class} target 错误发生所在的Class
 * @param {Class Instance} context  错误发生所在的Class实例对象
 * @param {String} methodName   错误发生的方法名
 * @param  {...any} params  其他自定义参数
 */
function defaultErrorHanlder(err, target, context, methodName, ...params) {
    console.log(
        "error catched by catchError decotator",
        err,
        target,
        context,
        methodName,
        ...params
    );
}
  • filter: 当装饰 class 时有用, 过滤哪些方法需要捕捉错误

Demo

Usage

基本使用

const createCatchError = require("class-error-catch");

const config = {
    errorHandler: function(
        err,
        target,
        context,
        methodName,
        message,
    ) {
        console.log("err:", err); //错误信息
        console.log("target:", target); //错误发生所在的Class
        console.log("context:", context); // 错误发生所在的Class实例对象
        console.log("methodName:", methodName); // 错误发生的方法名
        console.log("message:", message); // 自定义的错误消息
    }
};

const catchError = createCatchError(config);

function getPromise() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(new Error("超时错误"));
        }, 1000);
    });
}

class DemoClass {

    @catchError("Error from method sayHi")
    sayHi() {
        console.log(this.xxx.xxx);
    }

    @catchError("Error from async method sayHi2")
    async sayHi2() {
        const r = await getPromise();
        console.log("result", r);
    }
}
const demoClass = new DemoClass();
demoClass.sayHi();
demoClass.sayHi2();

//输出
//sayHi in  DemoClass
//自定义消息:Error from method sayHi

//sayHi2 in  DemoClass
//自定义消息:Error from async method sayHi2

react 中使用

import React, { Component } from "react";

import createCatchError from "class-error-catch";

const BUILTIN_METHODS = [
    "constructor",
    "render",
    "replaceState",
    "setState",
    "isMounted",
    "replaceState"
];

const PREFIX = ["component", "unsafe_"];
function customFilter(propertyName, descriptor) {
    if (typeof name !== "string" || name.trim() === "") {
        return false;
    }
    // 以component或者unsafe_开头
    if (PREFIX.some(prefix => name.startsWith(prefix))) {
        return true;
    }
    // 其他内置方法
    if (BUILTIN_METHODS.includes(name)) {
        return true;
    }
    return false;
}
const config = {
    errorHandler: function(
        err,
        target,
        context,
        methodName,
        message
    ) {
        console.log("err:", err); //错误信息
        console.log("target:", target); //错误发生所在的Class
        console.log("context:", context); // 错误发生所在的Class实例对象
        console.log("methodName:", methodName); // 错误发生的方法名
        console.log("message:", message); // 自定义的错误消息
    },
    filter: function(propertyName, descriptor) {
        return !customFilter(propertyName);
    }
};

const catchError = createCatchError(config);

class App extends Component {

    state = {
        xxx: "xxx"
    };

    @catchError("发生异常了啊 onClick_Initializer")
    onClick_Initializer = e => {
        console.log(window.onClick_Initializer.xxx);
    };

    @catchError("发生异常了啊 onClick_Fun")
    onClick_Fun() {
        console.log("xxx");
        console.log(window.onClick_Fun.xxxxx);
        this.setState({ xxx: "yyyy" }, () => {
            console.log(this.state);
        });
    }

    render() {
        const { onClick_Initializer, onClick_Fun } = this;
        return (
            <div className="App">
                <input
                    type="button"
                    value="initializer catch"
                    onClick={onClick_Initializer}
                />
                <input
                    type="button"
                    value="fun catch"
                    onClick={() => onClick_Fun.bind(this)()}
                />
            </div>
        );
    }
}

export default App;

Typings

none

License

MIT

1.0.31

5 years ago

1.0.3

5 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago