首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将catch (COMException ce)改为catch (COMException)

将catch (COMException ce)改为catch (COMException)
EN

Stack Overflow用户
提问于 2013-06-06 14:09:36
回答 3查看 854关注 0票数 1

我有以下代码:

代码语言:javascript
复制
       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;将重置堆栈跟踪并使它看起来像是从该函数抛出的异常。

我只想简单地将其改为“抛”,而不是“抛出”,这将消除警告。

  1. 下列渔获量有何不同: 捕捉(COMException ce) {抛出;} 和 捕捉(COMException) {抛出;}
  2. 如果我想以某种方式使用ce变量,我只需要拥有'COMException ce‘吗?
  3. 此外,当我执行“抛出”或“抛出ce”时,是调用函数来处理或捕获它吗?我有点不清楚这件事。
EN

回答 3

Stack Overflow用户

发布于 2013-06-06 14:14:57

这两种情况没有区别,但只有当堆栈/消息等应该使用异常变量时才有区别。

所以:

代码语言:javascript
复制
catch(ComException);

代码语言:javascript
复制
catch(ComException ex);

语句将产生类似的MSIL,但ComException对象的局部变量除外:

代码语言:javascript
复制
.locals init ([0] class [mscorlib]System.Exception ex)
票数 1
EN

Stack Overflow用户

发布于 2013-06-06 14:18:12

我肯定有人会提出一个uber技术的答案,但根据我的经验,您的前两个问题的答案是没有什么不同,而且正如您所说的,只有当您打算使用它将堆栈跟踪写入日志或向用户或类似的人显示消息时,您才会包含ce

throw将把异常发送到链上。这可能是调用方法,或者,如果您的方法有几个嵌套的try/catch块,它将将异常发送到当前try/catch块嵌套的下一个try/catch块。

如果您想进一步阅读这一主题,请查阅以下几个很好的参考资料:

  • 异常处理
  • 例外情况设计指南
票数 1
EN

Stack Overflow用户

发布于 2013-06-06 14:21:36

  1. 唯一的区别是,对于catch (COMException ce),您将异常赋值给一个变量,从而允许您在catch块中访问它。除此之外,它在各个方面都是相同的。
  2. 我不知道这里有什么问题。如果要访问异常对象,则必须在catch子句中为其指定一个变量名。
  3. 无论以何种方式或在何处抛出异常,异常都会在调用堆栈中冒泡到与之匹配的最接近的catch块。

下面是一个例子。

代码语言:javascript
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16964315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档