简体   繁体   English

我可以从服务工作者注册中得到实际错误吗?

[英]Can I get an actual error from a service worker registration?

For example, if I have a code like this:例如,如果我有这样的代码:

script.js : script.js

// ...
try {
  const serviceWorkerRegistration = await navigator.serviceWorker.register('/serviceWorker.js');
  await serviceWorkerRegistration.update();
  // ...
} catch (e) {
  console.error(e); // here I want to get an actual error
}
// ...

serviceWorker.js : serviceWorker.js

// ...
ddd; // the line with an error
// ...

Can I get the actual error ( Uncaught ReferenceError: ddd is not defined ) in my script.js instead of TypeError: Failed to update a ServiceWorker for scope (...) ServiceWorker script evaluation failed ?我可以在我的script.js中而不是TypeError: Failed to update a ServiceWorker for scope (...) ServiceWorker script evaluation failed中得到实际错误(未捕获的Uncaught ReferenceError: ddd is not defined )吗? My code is more complex and I see in my Sentry project that some browsers can't parse the service worker script, but I want to understand the reason for that case.我的代码更复杂,我在我的 Sentry 项目中看到某些浏览器无法解析 service worker 脚本,但我想了解这种情况的原因。 Also, I added Sentry client to my service worker, but anyway, an error can be thrown before it's registered.此外,我将 Sentry 客户端添加到我的服务工作者中,但无论如何,在注册之前可能会引发错误。

If there are some browsers that can't parse your code then it really just comes down to transpiling your code to a previous version of javascript.如果有些浏览器无法解析您的代码,那么它实际上只是将您的代码转换为之前版本的 javascript。 However, if these are tests that you are running then you have a development version that wrap your code in eval .但是,如果这些是您正在运行的测试,那么您有一个将代码包装在eval中的开发版本。

Just to be clear:只是要清楚:

Uncaught ReferenceError: ddd is not defined

Is a runtime error.是运行时错误。 It shouldn't be thrown while the engine is parsing your script.在引擎解析您的脚本时不应抛出它。 However, if you have something like:但是,如果你有类似的东西:

let [test] = [ddd]

You will most likely get a syntax error if your engine doesn't understand ES6 destructuring (even if ddd doesn't exist).如果您的引擎不理解 ES6 解构(即使ddd不存在),您很可能会遇到语法错误。

This:这个:

ddd

Can be caught within the service worker script like this可以像这样在服务工作者脚本中捕获

self.onerror = e => console.error(e);
ddd;

But if it fails at parsing like this... then it won't work:但是如果它无法像这样解析......那么它就行不通了:

self.onerror = e => console.error(e);
if(

However, if you wrap it in an eval :但是,如果将其包装在eval中:

self.onerror = e => console.error(e);
eval('if(');

Then this work (as eval parsing happens on runtime).然后这项工作(因为eval解析发生在运行时)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM