节点:从来没有使用try-catch?

我在Node.js中编写数据处理系统

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

  • 他们可能会以各种方式变形;
  • 他们可能是模棱两可的;
  • 他们可以相互矛盾。

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

  • 如果系统在交互模式下使用(即数据inputREPL),处理应该停止,build议一些动作并等待用户的决定。
  • 如果它运行在批处理模式(即数据来自文件,Web服务或类似的来源),我想继续处理丢弃这些信息。

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

我认为例外是解决这类问题的正确scheme,因为:

  • 格式不正确或相互矛盾的数据应该是一个例外 ;
  • 这样,特殊行为的代码将与通常的stream程明显分离;
  • 我将能够将例外提升到更高的层次,在这个层面上我可以决定究竟干什么。

于是我开始寻找指南,发现了两件相关的事情:

  1. 此评论由@Raynos Node.js最佳实践exception处理 ;
  2. http://codebetter.com/karlseguin/2010/01/25/don-t-use-try-catch/ 。

前者没有进一步解释。 后来我明白,但我认为这不是我的情况。

你如何解决这个问题? 我正在寻找一般的方法,不一定是平台或语言特定的…或JavaScript的尝试抓住有什么特别邪恶?

确实,try {} catch {} finally {}在标准节点中的有用性有限,并且error handling可能是有问题的。

然而,在最近的一个项目中,我使用了这些节点模块:Fibers,Fibers-Promise,我可以在asynchronouscallback方面做类似于Thread.join的事情,并且可以在程序中使用节点,而不是function风格。

有折衷。 Fibers /所有协同程序库修改节点的核心代码,使其无法在前端使用。 但是根据你的目的,你可能想看看这个。

如果是您正在处理的数据,您可能会尝试将该应用程序视为消息传输。

在这种模式下,不会有任何东西可以捕捉到,任何未被理解的数据都会有一条有效的消息返回给用户 – 一条消息表明数据是无效的。

这样你就不会试图使用你的代码来捕捉数据错误 – 这不是一件好事。

你并不需要一个专门的图书馆来处理这个问题,它和任何事情一样是一个思想的练习。 实际上,一个“模型”处理程序(认为MVC)将很好地完成这项工作。 或者,您只需在将任何非常糟糕的数据(例如零或太长)传递给parsing器函数之前过滤掉 – 如果parsing器无法完全理解数据,则默认为向用户返回错误消息。