我试图在我的 C# 代码中捕获一个互操作异常
IEngine engine = null;
try
{
engine = engineLoader.GetEngineObject(AbbyySdkSerialNumber);
}
catch(System.Runtime.InteropServices.COMException ex)
{
int i = 0;
}
但它不想跳入 catch 块。有任何想法吗?先感谢您!
CLR 自动将HRESULT
from COM 互操作映射到更具体的托管异常,而不是COMException
. 例如,E_ACCESSDENIED
变成UnauthorizedAccessException
、E_OUTOFMEMORY
变成OutOfMemoryException
等等。
如果HRESULT
是自定义结果或 CLR 不知道,则运行时会将泛型传递COMException
给客户端。的ErrorCode
属性COMException
包含HRESULT
值。
有关 COM 互操作的完整讨论,请参阅高级 COM 互操作性。
请注意,如果您在 VS 调试器下运行它,则默认情况下,执行将在导致异常的行上停止。它不会跳转到 catch 块,除非您随后进入下一行。
如果它肯定抛出异常,那么我敢打赌它实际上并没有抛出您期望的异常类型,即System.Runtime.InteropServices.COMException
. 我建议添加一个catch (Exception ex)
子句,try
以便首先检查我的理智,然后检查正在抛出的异常。
我也有同样的例外。它说我的项目 id 是错误的 - 这应该是您将在初始化期间插入到对象中的序列号。
建议:首先检查这个,如果你正在试用,那么如果它没有过期。
当我通过 win 服务运行 SDK 时出现异常。服务作为本地服务启动,由于无法通过 GetEngineObject 创建引擎对象而无法工作。我还尝试通过不同的用户名(进程)创建对象 GetEngineObject,但它没有帮助。问题是为什么我考虑在我的 Visual Studio 中创建控制台应用程序的用户名差异,在那里我将我的代码放入它并在 VS 中以调试模式运行它可以工作!(vs 以我的用户名运行)
我不知道出了什么问题...
就我而言,我需要捕获生成的异常的确切类型。它在代码的托管部分中生成了 System.IO.IOException 类型的异常,而在我的非托管代码中,我需要执行 catch(IOException ^),从而解决了问题。否则,即使使用 catch(Exception ^),也永远不会捕获到异常。