【问题标题】:Distinguishing between Exceptions thrown by Excel Interop operations区分 Excel 互操作操作引发的异常
【发布时间】:2012-09-19 11:18:44
【问题描述】:

我正在使用 Microsoft.Office.Interop.Excel 库从我的 C# 应用程序中将数据导出到 Excel。

使用无效的currentRow 值调用sheet.Cells[currentRow, 1]),会产生带有以下消息的System.Runtime.InteropServices.COMException

"Exception from HRESULT: 0x800A03EC"

还有ErrorCode -2146827284

但是,我收到了完全相同的错误代码,用于命令 Excel 保存到写保护文件。

我有没有办法区分从 Excel 收到的 COMExceptions,以便我可以相应地处理它们? 我不想让我的用户说“使用 Excel 时出了点问题,对不起,傻瓜。”

【问题讨论】:

  • 我使用 Excel 互操作已经好几年了,但我还没有找到方法。最好的办法是在潜在问题发生之前检查它们。我希望有更好的东西,但据我所知没有。
  • 这真是令人沮丧的事态。谢谢。你想把它作为答案吗?

标签: c# excel exception interop comexception


【解决方案1】:

我使用 Excel 互操作已经好几年了,但我还没有找到方法。最好的办法是在潜在问题发生之前检查它们。我希望有更好的东西,但据我所知没有。

编辑
您可以在 VBA 中捕获不同的错误,因此 Excel 本身会区分各种错误,但我相信 .NET 将所有这些错误都归入一个 COMException 类,它不会为您提供详细信息。

我发现这篇文章详细介绍了 VBA 错误代码:
http://support.microsoft.com/kb/146864

【讨论】:

  • 责任在于 Excel,而不是 .NET - 如果他们为不同的错误条件定义了不同的 HRESULT 值,那么在 .NET 代码中可以区分不同的错误。
  • 谢谢@Damien_The_Unbeliever - 我对此有点模糊。无法判断 Excel 是否隐藏了信息,或者 .NET 是否丢失了信息(可能是无法通过 .NET 互操作访问错误信息?)
【解决方案2】:

COMException 的全部意义在于它是从 COM 端返回的。通常,在 COM 中,错误条件由特定方法的 HRESULT 返回值表示,而不是 0。

不幸的是,这就是 COM“合同”中内置的错误信息的范围。所以你得到错误值(0x800A03EC 与 -2146827284 的值相同)。 .NET 方面没有更多信息。

【讨论】:

  • 有趣。 +1 了解 COM
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多