WebAssembly.Exception
åºçº¿
广æ³å¯ç¨
*
èª 2022å¹´5æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
夿³¨ï¼ æ¤ç¹æ§å¨ Web Worker ä¸å¯ç¨ã
WebAssembly.Exception 对象表示ä¸ä¸ªä» WebAssembly å JavaScript æåºãæè
ä» JavaScript å WebAssembly çå¼å¸¸å¤ç卿åºçè¿è¡æ¶å¼å¸¸ã
æé 彿°æ¥åä¸ä¸ª WebAssembly.Tagãä¸ä¸ªç±å¼ç»æçæ°ç»åä¸ä¸ª options 对象ä½ä¸ºåæ°ãæ ç¾å¯ä¸å°å®ä¹äºå¼å¸¸çç±»åï¼å
æ¬å¼å¸¸çåæ°ç顺åºååæ°çæ°æ®ç±»åãè®¿é®æåºçå¼å¸¸çåæ°æç¨çæ ç¾è¦æ±åç¨äºå建 Exception çæ ç¾ç¸åãæä¾äºç¨äºæµè¯å¼å¸¸æ¯å¦åç¹å®çæ ç¾å¹é
çæ¹æ³ï¼ä¹æä¾äºéè¿ç´¢å¼è·åç¹å®å¼çæ¹æ³ï¼å¦æå¼å¸¸å¹é
䏿å®çæ ç¾çè¯ï¼ã
å½å ³èçæ ç¾å ±äº«æ¶ï¼JavaScript åå ¶ä»å®¢æ·ç«¯ä»£ç ä» è½è®¿é® WebAssembly å¼å¸¸å¼ï¼åä¹äº¦ç¶ï¼ä½ ä¸è½ä» ä½¿ç¨æ°å¥½å®ä¹äºç¸åæ°æ®ç±»åçå ¶ä»æ ç¾ï¼ã没æå¹é çæ ç¾ï¼ä¹å¯ä»¥æè·ä»¥åéæ°æåºå¼å¸¸ï¼ä½æ¯ä¸è½å¯¹å ¶è¿è¡æ£æ¥ã
为äºè®©å¼å¸¸æåºæ´å¿«ï¼ä» WebAssembly æåºçå¼å¸¸é常ä¸å
æ¬å æ è·è¸ªãéè¦æä¾å æ è·è¸ªç WebAssembly 代ç å¿
é¡»å¨è°ç¨å建å¼å¸¸ç Javascript 彿°æ¶ï¼å¨æé 彿°ä¸ä¼ é options.traceStack=true åæ°ãç¶åæé 彿°å¯è½ä¼è¿åä¸ä¸ªå°å æ è·è¸ªéçå° stack 屿§çå¼å¸¸ã
æé 彿°
WebAssembly.Exception()-
å建ä¸ä¸ªæ°ç
WebAssembly.Exception对象ã
å®ä¾æ¹æ³
Exception.prototype.is()-
æµè¯å¼å¸¸æ¯å¦å¹é æä¸ªç¹å®çæ ç¾ã
Exception.prototype.getArg()-
è¿åä¸ç¹å®æ ç¾ç¸å¹é çå¼å¸¸çæ°æ®å段ã
å®ä¾å±æ§
Exception.prototype.stack-
è¿åå¼å¸¸çå æ è·è¸ªï¼æè
undefinedã
示ä¾
è¿ä¸ªç¤ºä¾å±ç¤ºå¦ä½å®ä¹ä¸ä¸ªæ ç¾å¹¶å°å ¶å¯¼å ¥å°æ¨¡åï¼ç¶åç¨å®æåºä¸ä¸ªå¨ JavaScript ä¸è¢«æè·çå¼å¸¸ã
æèä¸é¢ç WebAssembly 代ç ï¼åè®¾å ¶è¢«ç¼è¯ä¸º example.wasm æä»¶ã
- 模å导å
¥ä¸ä¸ªæ ç¾ï¼å
é¨å¼ç¨ä¸º
$tagnameå¹¶æä¸ä¸ªåç¬çi32åæ°ãtag ææä½¿ç¨æ¨¡åextmodåæ ç¾exttagä¼ éæ ç¾ã $throwException彿°ä½¿ç¨throwæä»¤æåºä¸ä¸ªå¼å¸¸ï¼æ¥æ¶$tagnameåæ ç¾çåæ°ã- 模å导åºä¸ä¸ªæåºå¼å¸¸å¼ä¸ºâ42âç彿°
run()ã
(module
;; 导å
¥çæ ç¾å¨è¿å¼ç¨ä¸º $tagname
(import "extmod" "exttag" (tag $tagname (param i32)))
;; $throwException 彿°å° i32 åæ°ä½ä¸º $tagname å¼å¸¸æåº
(func $throwException (param $errorValueArg i32)
local.get $errorValueArg
throw $tagname
)
;; 导åºè°ç¨ $throwException ç彿°ârunâ
(func (export "run")
i32.const 42
call $throwException
)
)
ä¸é¢ç代ç è°ç¨ WebAssembly.instantiateStreaming 导å
¥ example.wasm æä»¶ï¼ä¼ å
¥çâ导å
¥å¯¹è±¡âï¼importObjectï¼ä¸å
å«ä¸ä¸ªæ°çãå为 tagToImport ç WebAssembly.Tagã导å
¥ç对象ç¨å¹é
WebAssembly 代ç ä¸ import è¯å¥ç屿§å®ä¹ä¸ä¸ªå¯¹è±¡ã
䏿¦å®ä¾åæä»¶ï¼ä»£ç å°±è°ç¨å¯¼åºç WebAssembly run æ¹æ³ï¼è¯¥æ¹æ³ä¼ç«å³æåºä¸ä¸ªå¼å¸¸ã
const tagToImport = new WebAssembly.Tag({ parameters: ["i32"] });
// 注æï¼å¯¼å
¥å¯¹è±¡å±æ§è¦å¹é
WebAssembly import è¯å¥ï¼
const importObject = {
extmod: {
exttag: tagToImport,
},
};
WebAssembly.instantiateStreaming(fetch("example.wasm"), importObject)
.then((obj) => {
console.log(obj.instance.exports.run());
})
.catch((e) => {
console.error(e);
// æ£æ¥æä»¬æ¯å¦æè¯¥å¼å¸¸å¯¹åºçæ£ç¡®æ ç¾
// 妿æçè¯ï¼ä½¿ç¨ getArg() æ£æ¥å
¶å
容
if (e.is(tagToImport)) {
console.log(`getArg 0 : ${e.getArg(tagToImport, 0)}`);
}
});
/* æ¥å¿è¾åº
example.js:40 WebAssembly.Exception: wasm exception
example.js:41 getArg 0 : 42
*/
å¨ JavaScript ä¸ä½¿ç¨ catch åæè·å¼å¸¸ãæä»¬å¯ä»¥çè§å®æ¯ WebAssembly.Exception ç±»åï¼ä½æ¯å¦ææä»¬æ²¡ææ£ç¡®çæ ç¾çè¯ï¼æä»¬å°±ä»ä¹ä¹åä¸äºã
ç¶èï¼å 为æä»¬æä¸ä¸ªæ ç¾ï¼äºæ¯ä½¿ç¨ Exception.prototype.is() æ£æ¥å®æ¯å¦æ¯æ£ç¡®çé£ä¸ªï¼åå ä¸ºå®æ¯æ£ç¡®çï¼äºæ¯è°ç¨ Exception.prototype.getArg() 读åå¼â42âã
è§è
| è§è |
|---|
| WebAssembly JavaScript Interface: Exception Handling> # runtime-exceptions> |