节点:永远不要使用try-catch?

时间:2012-05-07 15:52:32

标签: exception node.js exception-handling callback try-catch

我正在Node.js中编写一个数据处理系统。

数据是用户提供的或来自外部来源,所以

  • 他们可能以各种方式畸形;
  • 他们可能含糊不清;
  • 他们可能互相矛盾。

在这些情况下,我通常想提醒用户,然后:

  • 如果系统以交互模式使用(即数据在REPL中输入),则应停止处理,建议某些操作并等待用户的决定。
  • 如果它以批处理模式运行(即数据来自文件,Web服务或类似的来源)我想继续处理丢弃这些信息。

当然,警告用户的方法也取决于模式。

我认为异常是解决这类问题的正确办法,因为:

  • 格式错误或矛盾的数据应该是例外;
  • 这种方式可以将特殊行为的代码与通常的流程分开;
  • 我可以将异常冒充到更高级别,我可以决定如何处理它。

所以我开始寻找指南并找到两个相关的东西:

  1. @Raynos Node.js Best Practice Exception Handling;
  2. 的评论
  3. http://codebetter.com/karlseguin/2010/01/25/don-t-use-try-catch/
  4. 前者没有进一步解释。后来我明白了,但我认为这不是我的理由。

    你会如何解决这个问题?我正在寻找一般方法,不一定是平台或语言特定的......或者JavaScript try-catch中有什么特别邪恶的东西吗?

2 个答案:

答案 0 :(得分:2)

try {} catch {} finally {}确实在标准节点中的用处有限,错误处理可能会有问题。

然而在我最近的一个项目中,我使用了这些节点模块:Fibers,Fibers-Promise以一种有效的方式,我可以在异步回调上做类似于Thread.join的事情,并且可以在程序中使用节点,而不是功能风格。

有权衡。光纤/所有协同常规库修改节点的核心代码,使其无法在前端使用。但是根据你的目的,你可能想看看这个。

答案 1 :(得分:0)

如果是您正在处理的DATA,您可能会尝试将该应用视为邮件传输。

在此模式中,无法捕获任何内容,任何未被理解的数据都会向用户返回有效消息 - 消息称数据无效。

通过这种方式,您不会尝试使用代码来捕获数据错误 - 这不是一件好事。

你真的不需要一个特殊的库来处理这个问题,它与任何事情都是一个思想练习。实际上,“模型”处理程序(想想MVC)可以很好地完成工作。或者,您只需在将其传递给解析器函数之前过滤掉任何非常糟糕的数据(例如零或过长) - 如果解析器无法完全理解数据,则默认向用户返回错误消息。