共享Web worker错误处理

时间:2014-09-10 22:41:27

标签: javascript web-worker

如何处理/抛出shared web worker中的错误?

如果在dedicated web worker中抛出这样的错误,则错误会出现在浏览器的控制台中..但是当工作人员被共享时却没有...!

使用专门的Web工作者,您还可以在worker中使用console.log()但不能在共享Web worker中使用

主页

var worker = new SharedWorker('js/webworker.js');

worker.port.onmessage = function(e){
    console.log('From worker: '+e.data);
};

worker.port.onerror = function(e){
    console.log(e.message+'\nLine: '+e.lineno+'\nFilename: '+e.filename);
};

worker.port.start();

worker.port.postMessage('This message should throw an error in the web worker');

共享网络工作者

var ports = [];

self.onconnect = function(e){
    var port = e.ports[0];
    ports.push(port);

    port.onmessage = function(e){
        port.postMessage(e.data);

        throw Error('hehehe');
    };

    port.start();

    port.postMessage('Worker connected!');
};

2 个答案:

答案 0 :(得分:3)

正如文件所说:

  

每当在其中一个工作程序脚本中发生未捕获的运行时脚本错误时,如果在处理上一个脚本错误时未发生错误,则用户代理必须在包含该错误的资源的URL处报告错误。脚本,使用WorkerGlobalScope对象的onerror属性,在worker中运行的脚本的原点中,发生错误的位置(行号和列号)。

http://www.w3.org/TR/workers/

因此,错误将报告给self,然后发送到所有端口:

self.onerror = function (e) {
  ports.forEach(function (port) { port.postMessage(e); });
};

以下是演示它的jsfiddle:http://jsfiddle.net/nhrfgd1L/

答案 1 :(得分:0)

(2021 年 7 月)

作为对已给出答案的更新,对于 Sharedworkers 而言,仅在客户端(网页)编写相应的事件处理程序就足够了,如下所示: https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker/onerror

基本上就是这个函数:

worker.onerror = function(error) {
    console.log('Worker error: ' + error.message + '\n');
};

error.message 包含错误的详细信息,如果您想显示它们或将它们放入日志中。

Sharedworker 本身不需要任何额外的代码来管理错误。