在做前端浏览器信息追踪,把所有获取信息的方法和 method 都放在了一个 object 里
但是有些浏览器默认阻止了一些行为导致执行中断,
有没有什么办法能够在异常处理里面执行完一个 object 的所有 method 。。。
举例:
traceinfo=new Object();
traceinfo.timezone=new Date().getTimezoneOffset();
traceinfo.hardwareConcurrency=navigator.hardwareConcurrency;
//cpu logical 核心数
traceinfo.timezone_extend=Intl.DateTimeFormat().resolvedOptions().timeZone;
//有些浏览器不支持
traceinfo.is_private_window=is_private_window();
traceinfo.os_info=getos_info();
traceinfo.os_info_extend=navigator.oscpu;
traceinfo 这个 object 里面既有 method 也有直接的浏览器变量赋值,如果直接像上面这样运行,假设比如火狐浏览器阻止了 navigator.hardwareConcurrency 数据的获取,抛出了 navigator 未定义异常,会导致后面的 timezone_extend ,is_private_window ,os_info ,os_info_extend 都为空
期待是能够(伪 python):
for methodname in traceinfo:
try:
traceinfo.dataname=traceinfo.methodname()
except:
traceinfo.dataname=null
得到的结果会都在 traceinfo 对象里面,个别获取不到的就为空就好
method 实在比较多,一个个用 try catch 包裹感觉不优雅...
1
Puteulanus 2022-03-15 19:55:30 +08:00
const arr = ['log','error','test','warn']
for (i in arr) { try { console[arr[i]](i) } catch (e) { console.log(e) } } 这样? |
2
rioshikelong121 2022-03-15 23:02:22 +08:00 1
借助一个函数把 = 后面的计算逻辑包裹在匿名函数里面传递过来?
function wrap(fn, ...args){ try { return fn.apply(this, args); } catch (e) { return null } } |
3
BreadKiller 2022-03-15 23:17:25 +08:00 1
forin 里 trycatch 就行了吧,和你写的那段伪 Python 差不多
for (const key in traceinfo) { if (Object.hasOwnProperty.call(traceinfo, key)) { const method = traceinfo[key]; if (typeof method === 'function') { try { traceinfo[key] = method(); } catch (error) { traceinfo[key] = null; } } } } |