我有以下代码:
try
{
retval = axNTLXRemote.IsUnitPresent(_servers[0].IPAddress, 1, _servers[0].RemotePort, _servers[0].CommFailDelay * 1000);
}
catch (COMException ce)
{
throw ce;
}这给了我以下的警告,我想摆脱它:
CA2200 : Microsoft.Usage:'Connect()‘将重新引发捕获的异常,并将其显式指定为参数。相反,使用“抛出”而不带参数,以保留最初引发异常的堆栈位置。
我已经阅读了下面的试/接/抛与试/抓(E)/throw e的区别,并且我理解‘抛出ce;将重置堆栈跟踪并使它看起来像是从该函数抛出的异常。
我只想简单地将其改为“抛”,而不是“抛出”,这将消除警告。
发布于 2013-06-06 14:14:57
这两种情况没有区别,但只有当堆栈/消息等应该使用异常变量时才有区别。
所以:
catch(ComException);和
catch(ComException ex);语句将产生类似的MSIL,但ComException对象的局部变量除外:
.locals init ([0] class [mscorlib]System.Exception ex)发布于 2013-06-06 14:18:12
我肯定有人会提出一个uber技术的答案,但根据我的经验,您的前两个问题的答案是没有什么不同,而且正如您所说的,只有当您打算使用它将堆栈跟踪写入日志或向用户或类似的人显示消息时,您才会包含ce。
throw将把异常发送到链上。这可能是调用方法,或者,如果您的方法有几个嵌套的try/catch块,它将将异常发送到当前try/catch块嵌套的下一个try/catch块。
如果您想进一步阅读这一主题,请查阅以下几个很好的参考资料:
发布于 2013-06-06 14:21:36
catch (COMException ce),您将异常赋值给一个变量,从而允许您在catch块中访问它。除此之外,它在各个方面都是相同的。catch子句中为其指定一个变量名。catch块。下面是一个例子。
void Method1()
{
try
{
Method2();
}
catch // this will catch *any* exception
{
}
}
void Method2()
{
try
{
Method3();
}
catch (COMException ex) // this will catch only COMExceptions and exceptions that derive from COMException
{
}
}
void Method3()
{
// if this code were here, it would be caught in Method2
throw new COMException();
// if this code were here, it would be caught in Method1
throw new ApplicationException();
}https://stackoverflow.com/questions/16964315
复制相似问题