不懂就问:HarmonyOS 鸿蒙Next关于多线程worker异常捕获和重启的问题

不懂就问:HarmonyOS 鸿蒙Next关于多线程worker异常捕获和重启的问题

目前写了一个空的worker(里面有一个手动抛出的异常):类似如下:

workerPort.onmessage(throw new Error('Something went wrong in the worker');)
workerPort.onerror = (err: ErrorEvent) => {
console.log("worker.ets onerror" + err.message)

主线程类似有个在获取error后重启线程的功能(重新new):

workerInstance .onerror{
workerInstance.terminate() //先关闭
workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets"); //后重启

流程为:主线程启动线程==>子线程手动抛出异常==>主线程接收异常后重启线程,但是线程存在问题,1.就是第二个执行到抛出异常的时候,程序会crash掉,

只有Error message:Error: Something went wrong in the worker的信息,我并不能知道到底怎么crash的,有人能解释下并且给个子线程崩溃重启的正确方案嘛

2.子线程中,比如workerPort.onmessage中存在aysn的异步方法,如果在这里面手动抛出异常,该子线程崩溃,且该错误信息没有通过onerror捕获到,这个该怎么处理呢,毕竟有些三方库

的很多方法只给了异步的

我现在唯一想到的就是用try catch把整体onmessage包起来,保证不会抛出异常,但是难免存在子线程不知道啥情况崩溃的情况,所以还是得解决上述问题,大佬们帮忙看下


更多关于不懂就问:HarmonyOS 鸿蒙Next关于多线程worker异常捕获和重启的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

你方便把代码贴一下吗,论坛里最好是贴代码别人就能更快理解,然后也更快解答,不然还要想你表达的和自己想的是不是一个东西~

更多关于不懂就问:HarmonyOS 鸿蒙Next关于多线程worker异常捕获和重启的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,Worker是一种用于执行多线程任务的机制。当Worker线程发生异常时,系统默认会终止该Worker线程,但开发者可以通过Worker.onerror事件来捕获异常并进行处理。若需要在异常发生后重启Worker,可以在捕获异常后重新创建并启动一个新的Worker实例。具体实现如下:

  1. 异常捕获:通过Worker.onerror监听Worker线程中的异常事件。例如:

    const worker = new Worker('workers/worker.js');
    worker.onerror = (error) => {
        console.error('Worker error:', error);
        // 异常处理逻辑
    };
    
  2. 重启Worker:在捕获到异常后,可以通过销毁当前Worker实例并重新创建来实现重启。例如:

    let worker = new Worker('workers/worker.js');
    worker.onerror = (error) => {
        console.error('Worker error:', error);
        worker.terminate(); // 终止当前Worker
        worker = new Worker('workers/worker.js'); // 重新创建Worker
    };
    

注意,Worker的重启逻辑需要开发者自行实现,且需确保不会因频繁重启导致资源耗尽或性能问题。

回到顶部