更改catch(COMException ce)以捕获(COMException)

时间:2013-06-06 14:09:37

标签: c# com exception-handling

我有以下代码:

       try
       {
           retval = axNTLXRemote.IsUnitPresent(_servers[0].IPAddress, 1, _servers[0].RemotePort, _servers[0].CommFailDelay * 1000);
       }
       catch (COMException ce)
       {
            throw ce;
       }

这给了我想要摆脱的跟随警告:

CA2200:Microsoft.Usage:'Connect()'重新抛出一个捕获的异常并将其明确指定为参数。改为使用不带参数的'throw',以保留最初引发异常的堆栈位置。

我已阅读以下The difference between try/catch/throw and try/catch(e)/throw e并且我理解'扔掉;将重置堆栈跟踪并使其看起来好像从该函数抛出了异常。

我想简单地将其更改为'throw'而不是'throw ce',它将消除警告。

  1. 以下捕获量有何不同:

       catch (COMException ce)
       {
            throw;
       }
    

       catch (COMException)
       {
            throw;
       }
    
  2. 如果我想以某种方式使用ce变量,我只需要'COMException ce'吗?

  3. 另外,当我执行'throw'或'throw ce'时,是否会处理或捕获它的调用函数?我对此并不清楚。

3 个答案:

答案 0 :(得分:1)

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

所以:

catch(ComException);

catch(ComException ex);

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

.locals init ([0] class [mscorlib]System.Exception ex)

答案 1 :(得分:1)

我确信有人会用一个超级技术的答案,但根据我的经验,前两个问题的答案是没有区别,正如你所说,你只包括ce如果您打算使用它将堆栈跟踪写入日志或将消息显示给用户或类似的。

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

以下是一些很好的资源,可以查看您是否想要进一步阅读该主题:

答案 2 :(得分:1)

  1. 唯一的区别是,使用catch (COMException ce),您将异常分配给变量,从而允许您在catch块中访问它。除此之外,它在各方面都是相同的。
  2. 我不确定这里的问题是什么。如果要访问异常对象,则必须在catch子句中为其指定变量名称。
  3. 无论抛出异常的方式或位置,异常都会通过调用堆栈冒泡到匹配的最近的catch块。
  4. 这是一个例子。

    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();
    }