Node.js 异常断言:async 函数写了 throw,为什么 assert.throws 仍说没有异常 给一个async函数写测试,函数第一句就throw,assert.throws却报告缺少预期异常。关键不在错误出现得够不够早,而在调用接口:async函数把失败表达为返回Promise的拒绝,同步异常断言不会替你等待... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash mapfile 的分隔参数:写了两个冒号,为什么仍按每一个冒号切开 输入A::B::C,希望按双冒号分成三项,把-d参数写成两个冒号以后,却读到五项,其中还有空字符串。Bash的mapfile只用delim参数的第一个字符决定记录终点,不会把整段参数解释成多字符分隔串。下面使用带-d... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash return 的八位状态:明明返回 256,为什么 if 却进入成功分支 把函数里算出的数量写成return 256,调用后if却认为成功,问号参数也只剩零。Bash的return传递的是命令退出状态,不是任意范围的数值结果。给它一个整数以后,调用者看到的是最低八位,原来的完整数字已经不能... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite TEMP 同名表:主表没有改,为什么 SELECT 却读到另一份内容 调试脚本建立了一张叫item的临时表,后面原封不动执行SELECT label FROM item,结果突然变成另一份数据。主库中的item可能完全没有改变,只是未带数据库名的表引用先找到了temp里的同名对象。查询... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite 同条 UPDATE 的取值时机:x 已经加一,为什么 y 仍然拿到旧的 x 想让x增加一,再把新x写进y,把两项放进同一条UPDATE的SET列表后,却发现y得到旧x。SQLite针对被更新行的列引用,会先求出右侧标量表达式,再实施赋值。SET中从左到右的书写位置,不能当作逐行执行的脚本步骤... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
JavaScript JSON 白名单:只想筛顶层字段,为什么嵌套对象也变成空了 导出一份任务数据时,只想保留顶层job和rows,于是把这两个名字放进JSON.stringify的第二个参数。结果两个顶层字段都在,job里面却变成空对象,rows中的对象也丢了字段。数组形式的replacer是一... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
JavaScript Array.fill 的对象参数:只改第一格,为什么三格的计数一起变了 给三张任务卡初始化计数,用Array(3).fill({ count: 0 })看起来简洁。随后只把第一张卡的count改成七,打印时三张卡却全是七。fill收到的是已经创建好的一个对象,它不会替每个位置再执行一次对... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python array.byteswap:数字顺序没有倒过来,为什么每个元素的值都变了 把一段二进制数据交给array.frombytes,能成功往返成相同字节,并不说明读出的整数符合发送方的含义。array采用本机元素表示;byteswap可以交换每个元素内部的字节,但它会原地改值,也不会把数组元素顺... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python urlsplit 的端口属性:地址已经拆分成功,为什么读取 port 才抛出异常 把urlsplit放进try里没有报错,就记录“网址校验成功”,后续代码访问parts.port却突然出现ValueError。这不矛盾:拆出URL的几个文本组件,与把端口转换成受范围约束的整数,不一定在同一个时点发... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python EmailMessage 重复头字段:再赋一次值,为什么旧值并没有被替换 整理邮件元数据时,把msg[字段名]写两次,看起来与普通字典更新相同。但EmailMessage允许某些头字段重复出现,赋值可能是在末尾追加。只读一次msg[字段名]又拿到一个字符串,很容易让第二份值在检查中消失。需... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读