我的第一份工作是在wosa/xfs规范下做金融设备中间件开发,后来在国产化替代的信创浪潮下从win平台迁移到linux平台.
这个金融设备中间件开发,抛开框架系统设计等比较有意思部分,80%的工作都集中在封装不同商家设备的sdk.
大致流程为wosa/xfs定义一组spi,上层负责与应用调用交互,中间层负责内部数据流转,最底层来调用厂家设备完成功能.
底层封装不复杂,但是架不住厂家众多,有时甲方会指定厂家,有时采购会选择便宜厂家,或者原厂家停止生产等等情况.
厂家能提供的sdk也是五花八门,有提供dll,so的,也有给指令集自己挂串口或者usb交互的.至于内部细节就更多了,有些厂家要用win平台消息通知那一套,有些厂家是提供一个可执行文件,用socket等方式和我做交互.
面对这茫茫多的api,我厌倦了调用一次写一次if判断一次是否成功,然后输出日志,进入错误处理.
于是我想到了可以用异常的方式来处理,可是异常需要对函数包装,本身就被api数量困扰,为每个api做一个包装层反而增加工作量.
那能不能让这个包装工作简化一些?所以我采用模板来完成这个自动化包装工作. 这里只是一个简化版,我抽出了核心骨架来表达想法,省略了特殊情况处理和入参反射(类似fmt,当然写的没别人好).
这个小玩具算的上一个转折点,从c++03进化到了c++17,认真学习了一堆模板知识和奇技淫巧. 当时觉得自己模板都能学会,小小的c++容不下我了.又去学习去学csapp,学习计算机架构,学习汇编等等. 换工作的时候感觉得挂个github装场面,所以它又被急急忙忙的被挂出来.
现在当然不会更新它了,没有需求也没啥实际价值,半吊子的模板用法更没有什么学习价值,仅仅留作纪念.
简单来说就是为任意函数绑定三个组件:
- 异常检查组件: 判断要不要抛异常
- 异常善后组件: 出现异常做些什么
- 反射组件: 展示异常信息需要一些函数信息
完成绑定的函数在最后会新增一个默认参数,表示异常等级,有时知道这里报错但不希望它抛出异常,或者不希望它反馈信息,静默处理等.
auto res = a.reduce_exp(i, 5);
如果出现异常,e.what()会记录错误信息,例如:
Exception!! 1.000000=reduce(6,5.000000)
完整输出是哪个函数报错,造成错误的入参是什么
如果启用忽略参数则不会抛出异常
auto res = a.reduce_exp(i, 5,ExceptionLevel::ignoreExcep);