我想在我的应用程序中使用COM对象 如何确保对象已在机器中注册?
我找到的唯一解决方案(也是on SO)是在初始化时使用try-catch块:
try {
Foo.Bar COM_oObject = new Foo.Bar();
} catch (Exception ee) {
// Something went wrong during init of COM object
}
我可以用其他任何方式吗? 我觉得通过期待和报告错误来处理错误是错误的,我宁愿知道我会失败并避免它开始。
答案 0 :(得分:6)
您正在以正确的方式使用异常处理:从您知道如何恢复的特定情况中优雅地失败。
在这种情况下使用try-catch没有问题,但你至少可以更具体地捕获:ComException。
答案 1 :(得分:1)
“我认为通过期待并报告错误来处理错误是错误的”
这不是try-catch的目的吗?顺便说一下,当一些非常糟糕的事情发生时会发生异常,并且因为你所指的COM对象未被注册是一件非常糟糕的事情,因此,异常是一个完美的解决方案。并且您无法以任何其他方式处理异常。
我认为这是正确的做法。
答案 2 :(得分:1)
如果您知道组件的ProgId。你可以尝试这个技巧
comType = Type.GetTypeFromProgID(progID,true/*throw on error*/);
答案 3 :(得分:0)
如果你这么做并且希望你有一个非异常的投掷等价物,试试:
public static class Catching<TException> where TException : Exception
{
public static bool Try<T>(Func<T> func, out T result)
{
try
{
result = func();
return true;
}
catch (TException x)
{
// log exception message (with call stacks
// and all InnerExceptions)
}
result = default(T);
return false;
}
public static T Try<T>(Func<T> func, T defaultValue)
{
T result;
if (Try(func, out result))
return result;
return defaultValue;
}
}
所以现在你可以这样做:
Foo.Bar newObj;
if (!Catching<ComException>.Try(() => new Foo.Bar(), out newObj))
{
// didn't work.
}
或者,如果您在defaultMyInterface
中存储了默认对象,那么如果没有更好的方法,您将使用它来实现接口:
IMyInterface i = Catching<ComException>.Try(() => new Foo.Bar() as IMyInterface,
defaultMyInterface);
您也可以在完全不同的情况下执行此操作:
int queueSize = Catching<MyParsingException>
.Try(() => Parse(optionStr, "QueueSize"), 5);
如果Parse
抛出MyParsingException
,则queueSize
将默认为5
,否则将使用Parse
返回的值(或任何其他异常将传播通常,这通常是您想要的意外异常。)
这有助于避免分解代码流,并且还集中了您的日志记录策略。