【问题标题】:Force javascript developer to handle an exceptions强制 javascript 开发人员处理异常
【发布时间】:2020-01-16 11:37:49
【问题描述】:

要描述函数抛出异常的可能性,我们可以使用 JSDock

/**
 * @throws {Error}
 */
export const a = () => {
  throw new Error("i am exist only to throw exceptions...")
}

好的,很可爱。 但是开发人员可能会错过该描述并且不将函数包装在 try...catch 中。

如何强制 typescript / IDE / ES-lint 告诉我我忘记在 try...catch 中包装函数?

我应该考虑制作一个 ES-lint 插件的想法吗? 或者有没有现成的解决方案? (除了所有可能参数的自动测试)

谢谢!

【问题讨论】:

  • 您可能不想try..catch 中包含某些内容,如果您希望下一个更高的调用者来代替它。 强制 你一直使用try..catch 会适得其反。如果调用层次结构中的 something 能够捕获异常,那就太好了,但是 Javascript 的动态特性使得使用静态分析器几乎不可能确保发生这种情况。
  • @deceze,这是真的,但在这种情况下,您可以使用另一个 JSDoc 注释(或其他方式)转发该抛出。最接近的类比是 JAVA 中的 'throws ..'。这个概念只是一个想法,一切都可能会有所不同。我只是感兴趣是否有任何类似的方法。
  • 我认为这是对您问题的一个很好的回答:stackoverflow.com/a/49435648/8575545

标签: javascript typescript try-catch eslint


【解决方案1】:

try...catch 是情境性的 - 如果您只想记录 JSDoc 中的异常和/或自己无法立即处理它(例如严重错误),您会遇到当前问题接近。

此外,理想情况下,错误是自记录的,并在代码本身中强制执行某种行为 - 其他所有内容都不是 DRY。代码/cmets可能会不同步,你还不如忘记记录@throws {Error}

所以我不确定 IDE 或 ES-lint 插件是否是一个好主意。相反,您可以创建某种 Either 数据类型,强制所有可能抛出函数 (a) 的消费者在某个时候对错误做出反应 - 否则他们不会得到返回值。一个简化的例子:

// wrap a riscy throwing function, so that it returns a plain value ("purify it")
const tryCatch = (myRiskyFn) => {
  try {
    return { val: myRiskyFn() };
  } catch (e) {
    return { err: e };
  }
}

// enforce client to handle error branch here, so we can return a well defined value back.
const valueFromEither = (either, onError) =>
  "err" in either ? onError(either.err) : either.val;

// Test error case:
const a = () => { throw new Error("some error..."); };
const either1 = tryCatch(a); // throws internally
const result1 = valueFromEither(either1, err => `Oh my! ${err}`);
console.log(result1); // Oh my! Error: some error...

// Test success case:
const b = () => 42;
const either2 = tryCatch(b); // goes thru
const result2 = valueFromEither(either2, err => `Oh my! ${err}`);
console.log(`yay! ${result2}`); // yay! 42

(在函数式编程方法中采用IOEitherTaskEither 的风格,但您可以自己使用它!)

【讨论】:

  • 这种情况下的另一种数据类型看起来是个好主意。在这种情况下,这正是 TS 的工作。很有帮助,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2010-11-09
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多