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 ...
最新文章
- 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
- Python基础05-数据类型:列表list
- python c++操作raw文件
- STL中各容器和适配器类的定义
- python 学习DAY11
- Shell脚本——变量
- python 二维数组长度_谈一谈多维数组
- 深入理解Python中的yield和send
- java三种经典的比对方法_几种任务调度的 Java 实现方法与比较
- 尚硅谷WebService技术精讲教程
- Vrep/CoppeliaSim:基础操作(1)
- Python3智联招聘网爬虫学习
- Ubuntu10.10下安装Tor,PolipoVidalia
- [转] prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
- 小数位数修约,四舍六入五成双
- 薪资大曝光,转行测试工程师:真香!!!
- 【报告分享】2020-2021年中国购物中心消费者洞察报告-中国连锁经营协会(附下载)
- java多图片上传功能的实现
- linux的几个发行网站
- std::ifstream实例
热门文章
- matlab for 循环中怎么做到只取其中一个数_公益心 码客行(8)—— 循环语句
- 解析oracle的dump文件,使用awk来解析dump文件
- poythoncode-实战4--读取文本文件,csv文件,存到系统中以大列表方式进行存储
- c#读取csv到数组_C#读取CSV文件的方法
- 2层框架结构柱子间距_钢筋混凝土楼板层其施工方法有哪些不同
- 网络不稳定的原因_原来网络不稳定,也有可能是这个原因造成的!
- mme设备内部错误_低压配电设备常见故障分析,处理办法介绍
- Python:matplotlib绘制条形图
- 如何给域里的每台电脑分配一个***远程访问IP地址
- 浏览器控件JxBrowser V6.14大版本发布 | 注入CSS