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多线程引擎(五)相关推荐

  1. 【JavsScript】推荐五款流行的JavaScript模板引擎

    摘要:Javascript模板引擎作为数据与界面分离工作中最重要一环,受到开发者广泛关注.本文通过开发实例解析五款流行模板引擎:Mustache.Underscore Templates.Embedd ...

  2. JavaScript 对引擎、运行时、调用堆栈的概述理解

    JavaScript 对引擎.运行时.调用堆栈的概述理解  随着JavaScript越来越流行,越来越多的团队广泛的把JavaScript应用到前端.后台.hybrid 应用.嵌入式等等领域. 这篇文 ...

  3. Web Worker javascript多线程编程(一)

    什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...

  4. 前端javaScript模板引擎之ArtTemplate

    一.简介 ArtTemplate是腾讯开发的一款使用方便.性能卓越javascript模板引擎,其渲染效率极其快.ArtTemplate的库分为两种,一个是template.js,这个是简单的语法版本 ...

  5. v8引擎处理html,JavaScript V8引擎基础教程

    本篇教程介绍了JavaScript V8引擎基础教程,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < 一.浏览器内核-渲染引擎 渲染,就是根据描述或者定义构 ...

  6. if laytpl 非_laytpl : 一款非常轻量的JavaScript模板引擎

    //假设你得到了这么一段数据 var data = { title: '前端圈', intro: '一群码js的骚年,幻想改变世界,却被世界改变.', list: [{name: '贤心', city ...

  7. javaScript 多线程并行编程 施工中~

    关键词:javascript 单线程本质,html5,worker,nodejs 封面P站画师ID:12191398 查看全文 http://www.taodudu.cc/news/show-4981 ...

  8. 最好JavaScript游戏引擎和游戏下载

    选择最适合您的项目JavaScript游戏引擎可能很困难. 做出最终选择之前,有很多因素需要考虑. 不仅包括功能,限制和要求之类的大选项,而且经常被忽略的较小细节(如可执行的导出选项,协作和支持的在线 ...

  9. 异步多线程(五)多线程异常处理

    异步多线程(五)多线程异常处理 参考文章: (1)异步多线程(五)多线程异常处理 (2)https://www.cnblogs.com/JohnTang/p/11010357.html (3)http ...

  10. 13 款 JavaScript 模板引擎

    JavaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于j ...

最新文章

  1. 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
  2. Python基础05-数据类型:列表list
  3. python c++操作raw文件
  4. STL中各容器和适配器类的定义
  5. python 学习DAY11
  6. Shell脚本——变量
  7. python 二维数组长度_谈一谈多维数组
  8. 深入理解Python中的yield和send
  9. java三种经典的比对方法_几种任务调度的 Java 实现方法与比较
  10. 尚硅谷WebService技术精讲教程
  11. Vrep/CoppeliaSim:基础操作(1)
  12. Python3智联招聘网爬虫学习
  13. Ubuntu10.10下安装Tor,PolipoVidalia
  14. [转] prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
  15. 小数位数修约,四舍六入五成双
  16. 薪资大曝光,转行测试工程师:真香!!!
  17. 【报告分享】2020-2021年中国购物中心消费者洞察报告-中国连锁经营协会(附下载)
  18. java多图片上传功能的实现
  19. linux的几个发行网站
  20. std::ifstream实例

热门文章

  1. matlab for 循环中怎么做到只取其中一个数_公益心 码客行(8)—— 循环语句
  2. 解析oracle的dump文件,使用awk来解析dump文件
  3. poythoncode-实战4--读取文本文件,csv文件,存到系统中以大列表方式进行存储
  4. c#读取csv到数组_C#读取CSV文件的方法
  5. 2层框架结构柱子间距_钢筋混凝土楼板层其施工方法有哪些不同
  6. 网络不稳定的原因_原来网络不稳定,也有可能是这个原因造成的!
  7. mme设备内部错误_低压配电设备常见故障分析,处理办法介绍
  8. Python:matplotlib绘制条形图
  9. 如何给域里的每台电脑分配一个***远程访问IP地址
  10. 浏览器控件JxBrowser V6.14大版本发布 | 注入CSS