对象不支持此属性或方法,别慌,这个报错没你想得那么可怕

admin

如果你写过一点代码,或者只是帮同事改过 Excel 宏、修过公司旧后台,大概率见过这句提示:“对象不支持此属性或方法”,第一次看到它的人,很容易心里一紧:是不是电脑坏了?是不是软件中毒了?是不是我动了什么不该动的东西?我特别理解这种感受,因为它不像“文件不存在”那么直白,也不像“网络连接失败”那么具体,听起来像是程序在跟你打哑谜。

但作为一个经常和各类小工具、小脚本打交道的自媒体作者,我想先说一句:这个报错真没那么玄乎,它的意思其实很朴素——你让一个对象去做它根本不会做的事,打个比方,你让一辆自行车“踩油门”,自行车当然会告诉你:我不支持这个操作,代码里的“对象不支持此属性或方法”,本质上就是程序在说:“你找的这个东西,没有你写的那个属性,也不会你写的那个方法。”

我身边就有个特别典型的生活实例,朋友小王在单位做报表,写了一段 Excel VBA,想把多个工作表里的数据汇总到一个总表,他一开始写的是 Workbooks("报表.xlsx").Range("A1").Value,结果运行就弹出“对象不支持此属性或方法”,他当时以为 Excel 坏了,重启了两遍,还差点重装 Office,后来我一看就笑了:Workbook 是工作簿对象,它本身没有 Range 属性。Range 是工作表对象的东西,你得先定位到具体工作表,Workbooks("报表.xlsx").Worksheets("汇总").Range("A1").Value,改完之后,程序立刻老老实实跑完了,你看,报错不是来捣乱的,它是在提醒你:对象找错了,或者方法用错了。

还有一个实例是我帮亲戚修一个老后台页面,那个系统在 Chrome 里点按钮一切正常,到了单位指定的旧 IE 浏览器里,按钮就像没睡醒一样,控制台报“对象不支持此属性或方法”,原因也不复杂:代码里用了 addEventListener,但老 IE 不支持这个方法,它认的是 attachEvent,年轻人可能觉得这都什么年代了,可现实就是这样,很多单位的内网系统还在跑老环境,后来我们加了一个兼容判断,问题就解决了,这个例子特别能说明问题:不是代码一定写得多烂,而是你以为那个对象“应该会”,实际上它“并不会”。

所以我现在看到“对象不支持此属性或方法”,基本不会先慌,而是按几个顺序排查,第一,先找到报错的具体行,别急着大面积改代码;第二,看这一行里点号前面的对象到底是什么,是工作表、工作簿、网页元素,还是一个空值;第三,查一下这个对象到底有没有这个属性或方法,文档、搜索、问人都行;第四,用最小例子复现,把无关代码删掉,看看问题还在不在;第五,加日志或弹窗,把对象类型和值打印出来,很多问题不是靠“我觉得”解决的,而是靠“我确认”解决的。

我个人的观点是,这类报错其实是程序员和脚本爱好者的“免费老师”,它虽然语气冷冰冰,但指向往往很明确:你正在错误地理解一个对象,比起那些悄无声息把数据算错、把页面弄乱的 bug,这种直接报错已经算很给面子了,我们真正要警惕的,不是报错本身,而是一看到报错就复制整段代码去搜,最后抄来一个更复杂的错误,排查这种问题,最重要的是建立“对象意识”:先问自己,我操作的是谁?它支持什么?我有没有把它当成别的东西?

说到底,“对象不支持此属性或方法”不是洪水猛兽,它只是一句翻译得有点生硬的提醒:兄弟,你问错对象了,把对象找对,把方法用对,很多看似吓人的问题,其实十分钟就能解决,下次再见到它,别急着重启电脑,先笑一下,然后从那一行代码开始找答案。

目录[+]