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. android的指纹问题
  2. java 命名管道_Java中命名管道的并发读/写(在Windows上)
  3. SAP CRM呼叫中心点了interact按钮后的处理逻辑
  4. Java 使用 POI 操作 Excel
  5. 移动web的适配问题
  6. linux配置php项目路径,linux下如何修改php.ini路径
  7. 啥?用了并行流还更慢了
  8. oracle分区表官方指南
  9. CISCO寄存器配置与说明
  10. docker 部分常用镜像下载及安装
  11. 如何获取小程序前端代码
  12. fedora linux搜狗输入法,GitHub - Hello-Linux/fedora-Sougou-Pinyin: fedora 搜狗拼音,安装超简单,各种精美皮肤!...
  13. 「广州SEO优化」Google优化SEO关键词排名工具
  14. 许小年:企业家精神的衰落与重振
  15. 关于如何发挥最好的学习状态的思考暨《自控力》一书读后感
  16. SpringBoot启动代表出现Process finished with exit code 0
  17. ORA-01012: not logged on处理
  18. STM32 USB应用——VCP
  19. 说说Oracle分区
  20. C# 打开指定目录并定位到文件

热门文章

  1. linux虚拟机头文件快捷键,linux学习笔记——基础命令、快捷键与认识虚拟机
  2. 使用python对学生表的查询_python + mysql 实现查询表数据
  3. php 监听模式,总结Laravel事件系统用法(监听事件,观察者模式)
  4. cv如何连接mysql_Naicvat操作数据库的基本操作
  5. 单位阶跃函数的傅里叶变换_傅里叶变换学习笔记(9)
  6. MySQL通过SQL语句生成实体类_使用sql生成表对应的CRUD语句和表对应java实体类的实例变量...
  7. go实现json格式文件的输出---小示例
  8. sql语句mysql_MySQL基本的Sql语句
  9. cognos报表导出excel_17个新增功能点,让报表更惊艳!
  10. VR线下体验店群雄并起,超级队长为何能靠IP突围?