Javascript多线程引擎(五)
Javascript多线程引擎(五)之异常处理
C语言没有提供一个像Java一样的异常处理机制, 这就带来了一个问题, 对于一个子函数中发生异常后, 需要在父函数调用子函数的位置进行Check, 如果发生异常则直接reuren. 这种机制, 会带来一个问题 ------- 过多的return 和 判断语句, 使得程序的维护成本提高.
而这个项目准备使用setjmp,longjmp的异常处理机制来实现throw异常后,能直接转到catch位置.
/*一个函数中mark都要不同*/ #define JS_TRY(mark) \int done##mark; \jmp_buf* jmp_buf##mark = (jmp_buf*)JsMalloc(sizeof(jmp_buf)); \for(done##mark = 0; \done##mark == 0 && (setjmp(*jmp_buf##mark) == 0 ? \(JsBuildRecord(jmp_buf##mark),1) : (JsOmitRecord(),0)); \++done##mark, JsOmitRecord())/*Catch之后, 异常已经被清除了, 并且e会被赋值 [NULL,Value] */ #define JS_CATCH(e) \if((e = JsGetError()))
这里使用两组宏, done##mark .. 确保了可以在一个函数中多次使用JS_TRY,
如下是对其中的函数用途解析.
/*抛出一个String类型的错误 */ void JsThrowString(char* msg); /*抛出一个error */ void JsThrow(struct JsValue* e); //保存一个还原点到环境中,p 为jmp_buf*指针void JsBuildRecord(void* p);//每次加锁的时候, 把对应的锁添加到最近还原点的上下文中 void JsPushLockToRecord(JsLock lock); //解锁的时候, 把给定的锁从最后面扫描, 剔除 void JsPopLockInRecord(JsLock lock);//检查当前环境是否存在异常, 当并不清除错误 int JsCheckError(); //在环境中删除一个最近的还原点 void JsOmitRecord();//获得当前错误, 并且清除当前错误, 如果没有则返回NULL struct JsValue* JsGetError();//设置一个错误, NULL表示清除错误 void JsSetError(struct JsValue* v);
基本原理是在, TLS中建立一个异常链, 每次throw的时候, 直接获取最近的还原点(Record). 然后通过GetError()获取到这个异常.
为什么要使用TLS? , 因为setjmp/longjmp 是基于函数栈的, 多个线程之间是不能跳转的.
值得一提的是, setjmp/longjmp 不会释放非托管资源(除内存外的所有资源, 比如说, lock, socket, file等), 所以在使用这些句柄的时候, 需要注意TRY --- CATCH
基本使用用法:
JS_TRY(0){可以放置表达式(函数调用, 赋值,...)如果使用return , break 语句则需要在之前调用JsOmitPoint()}doFinally工作struct JsValue* e = NULL;JS_CATCH(e){1. 处理错误2. 继续抛出异常JsThrow(e);}
截至到现在, 该引擎的基本模块已经完成, 进入了代码验证和测试阶段.!
项目地址为:
github.com/darkgem/js-engine
转载于:https://www.cnblogs.com/tickobject/p/3617197.html
Javascript多线程引擎(五)相关推荐
- 【JavsScript】推荐五款流行的JavaScript模板引擎
摘要:Javascript模板引擎作为数据与界面分离工作中最重要一环,受到开发者广泛关注.本文通过开发实例解析五款流行模板引擎:Mustache.Underscore Templates.Embedd ...
- JavaScript 对引擎、运行时、调用堆栈的概述理解
JavaScript 对引擎.运行时.调用堆栈的概述理解 随着JavaScript越来越流行,越来越多的团队广泛的把JavaScript应用到前端.后台.hybrid 应用.嵌入式等等领域. 这篇文 ...
- Web Worker javascript多线程编程(一)
什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...
- 前端javaScript模板引擎之ArtTemplate
一.简介 ArtTemplate是腾讯开发的一款使用方便.性能卓越javascript模板引擎,其渲染效率极其快.ArtTemplate的库分为两种,一个是template.js,这个是简单的语法版本 ...
- v8引擎处理html,JavaScript V8引擎基础教程
本篇教程介绍了JavaScript V8引擎基础教程,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < 一.浏览器内核-渲染引擎 渲染,就是根据描述或者定义构 ...
- if laytpl 非_laytpl : 一款非常轻量的JavaScript模板引擎
//假设你得到了这么一段数据 var data = { title: '前端圈', intro: '一群码js的骚年,幻想改变世界,却被世界改变.', list: [{name: '贤心', city ...
- javaScript 多线程并行编程 施工中~
关键词:javascript 单线程本质,html5,worker,nodejs 封面P站画师ID:12191398 查看全文 http://www.taodudu.cc/news/show-4981 ...
- 最好JavaScript游戏引擎和游戏下载
选择最适合您的项目JavaScript游戏引擎可能很困难. 做出最终选择之前,有很多因素需要考虑. 不仅包括功能,限制和要求之类的大选项,而且经常被忽略的较小细节(如可执行的导出选项,协作和支持的在线 ...
- 异步多线程(五)多线程异常处理
异步多线程(五)多线程异常处理 参考文章: (1)异步多线程(五)多线程异常处理 (2)https://www.cnblogs.com/JohnTang/p/11010357.html (3)http ...
- 13 款 JavaScript 模板引擎
JavaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于j ...
最新文章
- android的指纹问题
- java 命名管道_Java中命名管道的并发读/写(在Windows上)
- SAP CRM呼叫中心点了interact按钮后的处理逻辑
- Java 使用 POI 操作 Excel
- 移动web的适配问题
- linux配置php项目路径,linux下如何修改php.ini路径
- 啥?用了并行流还更慢了
- oracle分区表官方指南
- CISCO寄存器配置与说明
- docker 部分常用镜像下载及安装
- 如何获取小程序前端代码
- fedora linux搜狗输入法,GitHub - Hello-Linux/fedora-Sougou-Pinyin: fedora 搜狗拼音,安装超简单,各种精美皮肤!...
- 「广州SEO优化」Google优化SEO关键词排名工具
- 许小年:企业家精神的衰落与重振
- 关于如何发挥最好的学习状态的思考暨《自控力》一书读后感
- SpringBoot启动代表出现Process finished with exit code 0
- ORA-01012: not logged on处理
- STM32 USB应用——VCP
- 说说Oracle分区
- C# 打开指定目录并定位到文件
热门文章
- linux虚拟机头文件快捷键,linux学习笔记——基础命令、快捷键与认识虚拟机
- 使用python对学生表的查询_python + mysql 实现查询表数据
- php 监听模式,总结Laravel事件系统用法(监听事件,观察者模式)
- cv如何连接mysql_Naicvat操作数据库的基本操作
- 单位阶跃函数的傅里叶变换_傅里叶变换学习笔记(9)
- MySQL通过SQL语句生成实体类_使用sql生成表对应的CRUD语句和表对应java实体类的实例变量...
- go实现json格式文件的输出---小示例
- sql语句mysql_MySQL基本的Sql语句
- cognos报表导出excel_17个新增功能点,让报表更惊艳!
- VR线下体验店群雄并起,超级队长为何能靠IP突围?