草庐IT

python - 有没有办法在pywin32中解码数字COM错误代码

coder 2023-05-24 原文

这是最近运行一个用 Python 编写的不可靠应用程序的堆栈跟踪的一部分,该应用程序控制另一个用 Excel 编写的应用程序:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146788248), None)

显然出了点问题……但是什么?[1] 这些 COM 错误代码似乎过于神秘。

如何解码此错误消息?是否有表格可以让我将此数字错误代码转换为更有意义的内容?

[1] 我实际上知道在这种情况下出了什么问题,它试图访问没有 Name 属性的 Range 对象上的 Name 属性……并非所有错误都这么容易找到!

最佳答案

你没有做错任何事。堆栈跟踪中的第一项(数字)是 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 基础结构返回。

COM 对象还可以通过实现名为 IErrorInfo 的接口(interface)来选择提供更丰富的错误信息。当一个对象实现 IErrorInfo 时,它可以提供关于发生了什么的各种详细信息,例如详细的自定义错误消息,甚至是描述问题的帮助文件的名称。在 VB6 和 VBA 中。 Err对象允许您访问所有这些信息( Err.Description 等)。

更复杂的是,后期绑定(bind)的 COM 对象(使用一种称为 COM 自动化或 IDispatch 的机制)添加了一些需要剥离以获取信息的层。 Excel 通常通过后期绑定(bind)进行操作。

现在让我们再看看你的情况。你得到的第一个数字是一个相当通用的错误代码:DISP_E_EXCEPTION。注意:您通常可以通过谷歌搜索数字来找出 HRESULT 的正式名称,尽管有时您必须使用十六进制版本才能找到任何有用的信息。

以 DISP_ 开头的错误是 IDISPATCH 错误代码。该错误大致意味着“对象抛出了 COM 异常”,其他地方包含更多信息(尽管我不太清楚在哪里;我必须查找)。

根据我对 pywintypes.com_error 的理解,消息中的最后一个数字是对象在异常期间返回的实际错误代码。这是您从 VBA 中得到的实际数字代码 Err.Number .

不幸的是,第二个代码 -2146788248 (0x800A9C68) 在为自定义应用程序定义的错误消息保留的范围内(在 VBA 中: VbObjectError + someCustomErrorNumber ),因此没有集中的含义。对于不同的程序,相同的数字可能意味着完全不同的事情。

在这种情况下,我们已经走到了死胡同:

The error code is "custom", and the application needs to document what it is, except that Excel doesn't. Also, Excel (or the actual source of the error) doesn't seem to be providing any more information via IErrorInfo.



Excel 因自动化产生的神秘错误代码和导致它们的模糊情况而臭名昭著(至少对我而言)。对于可以考虑“设计时错误”(“您应该比调用对象中不存在的方法更清楚”)的错误尤其如此。你得到的不是“无法读取 Name 属性”,而是“ 运行时错误‘1004’:应用程序定义或对象定义的错误 ”(我只是通过尝试访问 Name 属性得到的)在范围上,来自 Excel 中的 VBA)。这不是很有帮助。

问题不是在 Python 或它的 Excel 接口(interface)上路由的。 Excel 本身并没有解释发生了什么,即使是 VBA。

但是,上述一般程序仍然有效。如果以后您从 Excel 中收到错误消息,您可能会收到一条更好的错误消息,您可以通过相同的方式进行跟踪。

祝你好运!

关于python - 有没有办法在pywin32中解码数字COM错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/521759/

有关python - 有没有办法在pywin32中解码数字COM错误代码的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  6. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  9. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  10. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

随机推荐