WebAssembly.Exception.prototype.stack
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
éæ å: è¯¥ç¹æ§å°æªæ ååãæä»¬ä¸å»ºè®®å¨ç产ç¯å¢ä¸ä½¿ç¨éæ åç¹æ§ï¼å 为å®ä»¬å¨æµè§å¨ä¸çæ¯ææéï¼ä¸å¯è½åçååæè¢«ç§»é¤ãä¸è¿ï¼å¨æ²¡ææ åé项çç¹å®æ åµä¸ï¼å®ä»¬å¯ä»¥ä½ä¸ºåéçæ¿ä»£æ¹æ¡ã
WebAssembly.Exception ç±»åçä¸ä¸ªå¯¹è±¡å®ä¾çåªè¯» stack 屿§å¯è½å
å«å æ è·è¸ªã
æ¥èª WebAssembly 代ç çå¼å¸¸é»è®¤ä¸ä¼å å«å æ è·è¸ªã
妿 WebAssembly 代ç éè¦æä¾å æ è·è¸ªï¼å®å¿
é¡»è°ç¨ JavaScript 彿°æ¥å建å¼å¸¸ï¼å¹¶ä¸ºå
¶æé 彿°ä¼ é options.trackStack=true åæ°ãç¶åèææºä¼å°å æ è·è¸ªéçå°è¯¥æé 彿°è¿åçå¼å¸¸å¯¹è±¡ä¸ã
夿³¨ï¼é常ä¸ä¼ä» WebAssembly 代ç åéå æ è·è¸ªä»¥æ¹åæ§è½ãç»å¼å¸¸æ·»å å æ è·è¸ªçè½åæ¯ä¸ºå¼åè å·¥å ·æä¾çï¼ä¸è¬ä¸å»ºè®®æ´å¹¿æ³ç使ç¨ã
å¼
ä¸ä¸ªå
å«å æ è·è¸ªçåç¬¦ä¸²ï¼æè
å½è·è¸ªæ²¡æè¢«èµå¼æ¶ä¸º undefinedã
å æ è·è¸ªå符串ååº WebAssembly æ ¼å¼çæ ä¸çæ¯ä¸ªæä½çä½ç½®ã宿¯äººç±»å¯è¯»çå符串ï¼å å« URLã被è°ç¨ç彿°ç±»ååã彿°ç´¢å¼ä»¥åå®å¨æ¨¡åäºè¿å¶ä¸çåç§»ãå®å¤§çº¦æ¯è¿ä¸ªæ ¼å¼ï¼åè§è§èä¸çå æ è·è¸ªçº¦å®è·åæ´å¤ä¿¡æ¯ï¼ï¼
${url}:wasm-function[${funcIndex}]:${pcOffset}
示ä¾
è¿ä¸ªä¾åå±ç¤ºå¦ä½ä» WebAssembly æåºä¸ä¸ªå å«å æ è·è¸ªçå¼å¸¸ã
èèä¸é¢ç WebAssembly 代ç ï¼å设å
¶è¢«ç¼è¯ä¸ºä¸ä¸ªå为 example.wasm çæä»¶ãå®å¯¼å
¥ä¸ä¸ªæ ç¾ï¼å
é¨å¼ç¨ä¸º $tagnameï¼å¹¶å¯¼å
¥ä¸ä¸ªå¼ç¨ä¸º $throwExnWithStack ç彿°ãå®å¯¼åºä¸ä¸ªå¯è¢«å¤é¨ä»£ç è°ç¨çæ¹æ³ runï¼ä»¥è°ç¨ throwExnWithStackï¼å°±æ¯ JavaScript 彿°ï¼
(module
;; 导å
¥çæ ç¾å¨è¿å¼ç¨ä¸º $tagname
(import "extmod" "exttag" (tag $tagname (param i32)))
;; 导å
¥ç彿°å¨è¿å¼ç¨ä¸º $throwExnWithStack
(import "extmod" "throwExnWithStack" (func $throwExnWithStack (param i32)))
;; å° 42 ä½ä¸ºåæ°è°ç¨ $throwExnWithStack
(func (export "run")
i32.const 42
call $throwExnWithStack
)
)
ä¸é¢ç JavaScript 代ç å®ä¹ä¸ä¸ªæ°æ ç¾ tag å彿° throwExceptionWithStackãå¨å®ä¾å WebAssembly æ¨¡åæ¶ï¼å°å®ä»¬æ¾å¨ importObject ä¸ä¼ éç» WebAssembly 模åã
䏿¦æä»¶è¢«å®ä¾åï¼ä»£ç å°±è°ç¨å¯¼åºç WebAssembly run() æ¹æ³ï¼è¯¥æ¹æ³ä¼ç«å³æåºä¸ä¸ªå¼å¸¸ãç¶å catch è¯å¥ä¼æå°æ ã
const tag = new WebAssembly.Tag({ parameters: ["i32"] });
function throwExceptionWithStack(param) {
// 注æï¼æä»¬ç¨â{traceStack: true}âç³æå¼å¸¸
throw new WebAssembly.Exception(tag, [param], { traceStack: true });
}
// 注æï¼importObject 屿§è¦å WebAssembly import è¯å¥ç¸å¹é
ã
const importObject = {
extmod: {
exttag: tag,
throwExnWithStack: throwExceptionWithStack,
},
};
WebAssembly.instantiateStreaming(fetch("example.wasm"), importObject)
.then((obj) => {
console.log(obj.instance.exports.run());
})
.catch((e) => {
console.log(`æ ï¼${e.stack}`);
});
// æ¥å¿è¾åºï¼åè¿æ ·ï¼ï¼
// æ ï¼throwExceptionWithStack@http://<url>/main.js:76:9
// @http://<url>/example.wasm:wasm-function[3]:0x73
// @http://<url>/main.js:82:38
该代ç 䏿âç¸å ³âçé¨åæ¯å建å¼å¸¸çé£è¡ï¼
new WebAssembly.Exception(tag, [param], { traceStack: true });
ä¼ é {traceStack: true} æ¯åè¯ WebAssembly èææºå®åºè¯¥å°å æ è·è¸ªéçå°è¿åç WebAssembly.Exceptionãå¦ææ²¡æçè¯ï¼æ å°ä¼æ¯ undefinedã