内容简介:木兰原始可执行文件的报错信息非常简单,并不包含出错位置和调用层级信息: >ulang-0.2.2.exe 测试\错误处理\引用模块.ul IndexError: list index out of range 这在交互环境或者源码文件单一很短时还可接受,...
木兰原始可执行文件的报错信息非常简单,并不包含出错位置和调用层级信息:
>ulang-0.2.2.exe 测试\错误处理\引用模块.ul
IndexError: list index out of range
这在交互环境或者源码文件单一很短时还可接受,但开发更长代码或者多文件项目时就使得排错十分困难。四个月前添加了一些中文报错信息,本周在对井字棋游戏进行重构时,发现多文件互相引用时未显示层级调用信息,颇为不便,于是进行了修正。现在的报错行为举例如下:
1 报错信息
交互环境中仅提示出错所在位置简要信息:
> func a(n) { return n1+1 }
> func b(n) { print(n) }
> b(a(2))
???? 请先定义'n1'再使用, 见第1行
运行源码时,可见调用各层的详细信息:
$ 木兰 测试/错误处理/未定义变量于多层函数.ul
???? 请先定义'数1'再使用
见第2行:return 数1 + 1
调用层级如下
见第7行:输出(加(2))
如果错误发生在其他文件,可见文件名:
$ 木兰 测试/错误处理/引用模块.ul
???? 取列表内容时,索引超出范围
“测试/错误处理/下标越界函数.ul”第2行:print([][0])
调用层级如下
见第3行:a()
如果某被引用的模块加载出错,现在只能提示问题模块,今后将尝试加上该模块的具体问题和定位信息,另外还有个相关问题:
$ 木兰 测试/错误处理/引用问题模块.ul
???? No module named '测试'
调用层级如下
见第1行:using * in 测试.错误处理.无此变量
如果错误可以定位到列,则也用醒目符号提示出错位置,木兰源码的层级调用信息将在之后版本清除:
$ 木兰 测试/错误处理/中文对齐.ul
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/bin/木兰", line 10, in <module>
sys.exit(中())
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/木兰/中.py", line 54, in 中
节点 = 分析器.分析(源码, 源码文件)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/木兰/分析器/语法分析器.py", line 972, in 分析
节点 = self.分析器.parse(各词, state=self)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/木兰/分析器/rply_parser.py", line 92, in parse
self.error_handler(state, lookahead)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/木兰/分析器/语法分析器.py", line 933, in error_handler
源码=self.源码)
木兰.分析器.错误.语法错误: 文件 "测试/错误处理/中文对齐.ul", 第1行, 第12列, 没认出这个词 "by"
print("铛铛" ✋by 2)
如果有大括号未匹配,会报 $end 错误于文件末尾,希望今后参考其他编译器进行改进:
$ 木兰 测试/错误处理/括号不匹配.ul
【前略】
木兰.分析器.错误.语法错误: 文件 "测试/错误处理/括号不匹配.ul", 第6行, 第2列, 没认出这个词 "$end"
*✋/
2 其他
2.1 问题还是本意:枚举值在不同模块中不相等
在重构井字棋的过程中发现,在 e 模块定义的 T 枚举类型有 X、O 两项,在 a 模块中赋值 aa 为 T.X,在 b 模块中判断 aa == T.X,结果返回 false。
现在规避的方法是在 a 模块中加一个接口用来判断 aa == T.X,来避免 b 模块对 T 的依赖。
尚需细究根源。详见此 issue
2.2 命令添加了取版本信息选项“--版本”:
$ 木兰 --版本
0.0.14.4
$ 木兰 -版
0.0.14.4
下一步
继续对自带的木兰代码编辑器进行重构和改进,以尽早投入实用。
附录:代码量统计
主要部分的代码行数统计,格式为:上次->现在。
- 木兰代码量 2873
- 编辑器,实现与测试都是木兰代码:381 -> 402
- 木兰测试用例,包括部分实用小程序(如井字棋):2304 -> 2471
- Python 代码量(木兰实现与测试框架):2473 -> 2523
分析器/语法分析器.py
:989 -> 990测试/运行所有.py
,检验所有木兰测试代码片段:187 -> 189分析器/语法树.py
:178 -> 188环境.py
,定义全局方法:157 -> 160中.py
,主程序:45 -> 74功用/调试辅助.py
,:56 -> 57功用/反馈信息.py
:49 -> 55setup.py
, 33 -> 34- 未变
分析器/词法分析器.py
:198交互.py
,交互环境(REPL):138分析器/语法成分.py
,从语法分析器中提取出来的枚举常量:79分析器/错误.py
:17测试/unittest/语法树.py
,确保生成的语法树与原始版本一致:67测试/unittest/交互.py
,交互环境相关测试:28
以上所述就是小编给大家介绍的《木兰编程语言 0.0.14.4:中文报错信息规整,枚举引用新发现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Go 语言函数式编程系列教程(二) —— 常量和枚举
- 木兰编程语言 0.0.14.3:井字棋演示,tuple、枚举等
- c# – 枚举时项目发生变化时是否会影响枚举?
- 测者的测试技术手册:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)
- 测者的JUnit单元测试探坑记:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)
- c# – 循环枚举类型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective Python
布雷特·斯拉特金(Brett Slatkin) / 爱飞翔 / 机械工业出版社 / 2016-1 / 59
用Python编写程序,是相当容易的,所以这门语言非常流行。但若想掌握Python所特有的优势、魅力和表达能力,则相当困难,而且语言中还有很多隐藏的陷阱,容易令开发者犯错。 本书可以帮你掌握真正的Pythonic编程方式,令你能够完全发挥出Python语言的强大功能,并写出健壮而高效的代码。Scott Meyers在畅销书《Effective C++》中开创了一种以使用场景为主导的精练教学方......一起来看看 《Effective Python》 这本书的介绍吧!