您没有做错任何事。堆栈跟踪中的第一项(数字)是COM对象返回的错误代码。第二项是与错误代码关联的描述,在这种情况下为“发生异常”。pywintypes.com_error已经为您调用了win32api.FormatMessage(errCode)的等效项。我们将在一分钟内查看第二个数字。
顺便说一句,您可以使用Visual Studio(C: Program Files Microsoft Visual Studio 9.0
Common7 Tools ErrLook.exe)附带的“错误查找”实用程序作为快速启动垫来检查COM错误代码。
该实用程序还会为您调用FormatMessage并显示结果。并非所有的错误代码都可以使用这种机制,但是很多都可以。那通常是我的第一站。
COM中的错误处理和报告有点混乱。我将尽力为您提供一些背景知识。
所有COM方法调用都将返回一个称为HRESULT的数字代码,该代码可以指示成功或失败。COM中所有形式的错误报告都基于此。
这些代码通常以十六进制表示,尽管有时您会看到它们是32位大数字,就像在堆栈跟踪中一样。对于常见的结果和问题,有各种预定义的返回代码,或者对象可以在特殊情况下返回自定义数字代码。例如,值0(称为S_OK)通常表示“无错误”,而0x80000002为E_OUTOFMEMORY。有时,HRESULT代码由对象返回,有时由COM基础结构返回。
通过实现名为IErrorInfo的接口,COM对象还可以选择提供更多的错误信息。当对象实现IErrorInfo时,它可以提供有关所发生情况的各种详细信息,例如详细的自定义错误消息,甚至是描述问题的帮助文件的名称。在VB6和VBA中。该
Err对象允许您访问所有这些信息(
Err.Description,等)。
使事情复杂化的是,后期绑定的COM对象(使用称为COM
Automation或IDispatch的机制)添加了一些层,这些层需要剥离才能获取信息。Excel通常通过后期绑定进行 *** 作。
现在,让我们再次查看您的情况。作为第一个数字,您得到的是一个相当通用的错误代码:DISP_E_EXCEPTION。
注意:您通常可以通过搜索数字来找出HRESULT的正式名称,尽管有时您必须使用十六进制版本才能找到有用的内容。
以DISP_开头的错误是IDISPATCH错误代码。该错误松散地表示“对象抛出了COM异常”,并在其他位置打包了更多信息(尽管我不太清楚该在哪里;我必须查找它)。
据我对pywintypes.com_error的了解,消息中的最后一个数字是该对象在异常期间返回的实际错误代码。这是您从VBA中获得的实际数字代码
Err.Number。
不幸的是,第二个代码-2146788248(0x800A9C68)处于为自定义应用程序定义的错误消息保留的范围(在VBA中:)
VbObjectError+ someCustomErrorNumber,因此没有集中的含义。对于不同的程序,相同的数字可能意味着完全不同的事物。
在这种情况下,我们已经走到了尽头:
错误代码是“自定义”,应用程序需要记录它是什么,除了Excel不需要。另外,Excel(或错误的实际来源)似乎没有通过IErrorInfo提供更多信息。
Excel臭名昭著(至少对我而言)是来自自动化的隐秘错误代码以及导致它们的晦涩难懂的情况。对于那些可以考虑“设计时错误”的错误尤其如此(“您应该比调用对象中不存在的方法更了解”)。而不是一个不错的“无法读取Name属性”,您会收到“
运行时错误‘1004’:应用程序定义或对象定义的错误
”(我只是通过尝试从VBA访问Range上的Name属性而获得的在Excel中)。那不是很有帮助。
该问题未在Python上解决,或未在Excel上解决。Excel本身甚至无法向VBA解释发生了什么。
但是,上面的一般过程仍然有效。如果以后再收到Excel错误,则可能会收到更好的错误消息,您可以用相同的方式进行跟踪。
祝好运!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)