@xfe-team/catch-error
TypeScript icon, indicating that this package has built-in type declarations

0.0.4 • Public • Published

@xfe-team/catch-error

通过装饰器或包裹的形式捕获异常, forked from catch-decorator

安装

yarn add @xfe-team/catch-error

使用

以前的形式:

class Messenger {
    async getMessages() {
        try {
            await api.getData() // <-- can throw ServerError
        } catch(err) {
            ...
        }   
    }
}

通过当前工具我们可以这样:

import catchError from '@xfe-team/catch-error';

class Messenger {
    @catchError(ServerError, handler)
    async getMessages() {
        await api.getData() // <-- can throw custom ServerError
    }
}

我们可以捕获所有的 Error 异常:

import catchError from '@xfe-team/catch-error';

class Messenger {
    @catchError(Error, (err: any) => console.log(err.message))
    getMessages() {
        throw new TypeError('ReferenceError here!');
        ...
    }
}

由于部分不标准的第三方库可能直接 throw 'invalid type' 抛出非 Error 类型的错误, 我们可以用 * 捕获异常:

import catchError from '@xfe-team/catch-error';

class Messenger {
    @catchError('*', (err: any) => {/* 处理相关异常 */})
    getMessages() {
        throw new TypeError('ReferenceError here!');
        ...
    }
}

有一些情况下我们希望容错, 吃掉所有异常, 不让异常向上抛: import catchError from '@xfe-team/catch-error';

class Messenger {
    @catchError('*')
    getMessages() {
        throw new ReferenceError('ReferenceError here!')
        ...
    }
}

我们还可以通过这样形式分别处理不同类型的异常:

import catchError from '@xfe-team/catch-error';

class Messenger {
    @catchError(TypeError, (err, ctx) => {...})
    @catchError(ReferenceError, (err, ctx) => {...})
    getMessages() {
        throw new ReferenceError('ReferenceError here!')
        ...
    }
}

也能够支持异步场景:

class Messenger {
    errorMessage = null

    @catchError(ServerError, (err, ctx) => ctx.errorMessage = err.message)
    getMessages() {
        return fetch(myRequest).then(response => { // can throw ServerError
            ...
        })
    }
}

为了代码整洁, 我们不希望使用匿名函数:

class Messenger {
    onServerError(error) {
       /* 在这里处理异常 */
    }

    @catchError(ServerError, 'onServerError')
    getMessages() {
        return fetch(myRequest).then(response => { // can throw ServerError
            ...
        })
    }
}
class Messenger {
    onServerError(error) {
       /* 在这里处理异常 */
    }

    @catchError(ServerError, (err, ctx)=> ctx.onServerError(error))
    getMessages() {
        return fetch(myRequest).then(response => { // can throw ServerError
            ...
        })
    }
}

ChangeLog

0.0.3 (2019-12-09)

  • fix: 修复 errorClass 错误写成 error 的 typo 问题
  • remove: 移除 errorClass 作为独立 function 的场景

0.0.1 (2019-12-09)

  • feat: init commit

作者

She Ailun
enkot (原作者)

Dependents (0)

Package Sidebar

Install

npm i @xfe-team/catch-error

Weekly Downloads

13

Version

0.0.4

License

MIT

Unpacked Size

22.5 kB

Total Files

26

Last publish

Collaborators

  • licanbluesea
  • jf3096
  • zheever
  • oneli