【问题标题】:Can't catch node-opencv errors?无法捕获 node-opencv 错误?
【发布时间】:2013-09-09 21:23:18
【问题描述】:

我正在尝试捕获 node-opencv(本机绑定)引发的错误,而不是使进程崩溃。

https://github.com/peterbraden/node-opencv

我尝试使用try{}catch(){} 块并使用process.on('uncaughtException', function (exception) {}); 都没有任何效果,抛出错误时进程仍然崩溃。

示例:libc++abi.dylib: terminate called throwing an exception

这个问题是指任何被抛出的 opencv 错误,而不是一个特定的错误。

我可以将我所有的 node-opencv 放到他们自己的进程中吗?然后将其作为我的主进程的子进程运行。当它崩溃时,重新启动它并继续?

【问题讨论】:

  • node-opencv 内部是一个非常丑陋的模块,看起来它没有捕获自己的异常,所以你不能做太多事情。除非您想深入了解模块,并更改其代码(添加 C 异常处理),然后使用 node-gyp 重新编译。
  • 你能在你的帖子中写下如何重现错误吗?
  • @hexacyanide 这不是针对特定错误,而是针对此库引发的任何错误。错误可以通过多种方式产生,只需传入一个错误的缓冲区或其他东西。
  • @MaksimsMihejevs 请参阅编辑 2,如果您认为这可行,请告诉我。谢谢。
  • 是的,您可以使用集群和工作进程。但是当你意识到当你需要清理一些媒体或完成一些算法但它会丢失时可能会有并发症,所以你会喜欢从干净开始。如果错误很少见,它通常会起作用。

标签: node.js exception opencv try-catch


【解决方案1】:

你可以使用domain

域提供了一种方法来处理多个不同的 IO 操作作为 单组。如果任何事件发射器或回调注册到 域发出错误事件,或抛出错误,然后域 对象将被通知,而不是丢失错误的上下文 在 process.on('uncaughtException') 处理程序中,或导致程序 立即退出并显示错误代码。

好吧,你不喜欢我之前的回答,所以这里是另一个:

http://snmaynard.com/2012/12/21/node-error-handling/

http://benno.id.au/blog/2011/08/08/nodejs-exceptions

另一个选择是使用 node.js 提供的事件系统。那 是我们接下来要看的,因为它是 node.js 内部使用的。我们 将更改我们的代码,以便 y 发出一个 myerror 事件,而不是 而不是冒泡的异常。

var events = require('events')
emitter = new events.EventEmitter()

function y(arg, callback) {
    if (arg === 1) {
    x()
    callback()
    } else {
    function onTick() {
        try {
        x()
        } catch(err) {
        emitter.emit('myerror', err)
        return
        }
        callback()
    }
    process.nextTick(onTick)
    }
}

节点代码非常特殊地处理称为错误的事件。来自 event.js 中的发出代码:

  if (type === 'error') {
    if (!this._events || !this._events.error ||
        (isArray(this._events.error) && !this._events.error.length))
    {
      if (arguments[1] instanceof Error) {
        throw arguments[1]; // Unhandled 'error' event
      } else {
        throw new Error("Uncaught, unspecified 'error' event.");
      }
      return false;
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2015-01-10
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多