麦壳博客
麦壳ZONE
Skip to content

TryCatch函数装饰器

1. 装饰器代码

js
function catchFunc(type, e) {
  switch (type) {
    case null:
    case "null":
      return null;
    case "http":
      return {
        code: 0,
        message: e.message,
        timestamp: new Date().getTime(),
      };
    case "message":
      return e.message;
  }
}

export function Try(type = null) {
  return function (target, propertyKey, descriptor) {
    const fn = descriptor.value;
    const isAsyncFunc = fn.constructor.name === "AsyncFunction";
    if (isAsyncFunc) {
      descriptor.value = async function (...args) {
        try {
          return await fn.call(this, ...args);
        } catch (e) {
          return catchFunc(type, e);
        }
      };
    } else {
      descriptor.value = function (...args) {
        try {
          return fn.call(this, ...args);
        } catch (e) {
          return catchFunc(type, e);
        }
      };
    }
    return descriptor;
  };
}

2. 装饰器使用

js
import { Try } from "decorator.js";
@Try('http')
async doItAsync(params) {
	throw new Error("http error");
}
// 返回
// {
// 	code: 0,
// 	message: "http error",
// 	timestamp: xxxx,
// }

@Try('message')
doIt(params) {
	throw new Error("message error");
}
// 返回
// "message error"