2013-06-06 4 views
1

나는 다음과 같은 코드가 있습니다변경 캐치 (COMException 가전은) 잡으려고 (COMException)

내게 제거 할 followig 경고 제공
 try 
     { 
      retval = axNTLXRemote.IsUnitPresent(_servers[0].IPAddress, 1, _servers[0].RemotePort, _servers[0].CommFailDelay * 1000); 
     } 
     catch (COMException ce) 
     { 
      throw ce; 
     } 

:

CA2200을 : 마이크로 소프트. 사용 : 'Connect()'는 catch 된 예외를 다시 발생시키고이를 명시 적으로 인수로 지정합니다. 예외가 처음에 발생한 스택 위치를 보존하려면 인수없이 'throw'를 대신 사용하십시오.

나는 다음을 읽었습니다 The difference between try/catch/throw and try/catch(e)/throw e 그리고 저는 ' 스택 추적을 재설정하고 해당 함수에서 예외가 발생 된 것처럼 보이게합니다.

경고를 제거하는 'throw ce'대신 단순히 'throw'로 변경하고 싶습니다.

catch (COMException ce) 
    { 
     throw; 
    } 

catch (COMException) 
    { 
     throw; 
    } 
  • 내가 어떻게 든 CE를 사용하고자하는 경우 난 단지 'COMException 가전'을 가지고해야합니까 : 다음 어획량의 차이는 무엇

    1. 변하기 쉬운?

    2. 또한 'throw'또는 'throw ce'를 수행 할 때 처리하거나 catch하는 호출 함수입니까? 나는 이것에 대해 약간은 분명하지 않다.

  • +0

    좋은 조언. 더 나은 조언은 try/catch를 제거하는 것 뿐이며, 아무런 도움이되지 않습니다. –

    +0

    사실 일 필요는 없습니다. 어쩌면 그는 COMException 예외를 던지기를 원하지만 다른 예외를 다르게 처리하려고 할 수도 있습니다. 코드를 모두 보지 않고 말하기가 어렵습니다. –

    +0

    나는 try/catches로 가득 차있는 프로젝트를 물려 받았다. 그래서 나는 경고등을 정돈하려고 노력하고있다. 나는이 단계에서 그들 모두를 제거 할 수 없다. –

    답변

    1

    가 두 경우 모두에서 차이가 없지만, 예외 변수 스택/메시지 등 그래서

    사용해야 때

    catch(ComException); 
    

    catch(ComException ex); 
    

    명령문은 ComException 객체의 로컬 변수를 제외하고 유사한 MSIL을 생성합니다.

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

    누군가는 동네 짱 - 기술 대답으로 이동합니다 확신 해요,하지만 내 경험에서 처음 두 질문에 대한 대답은, 차이가 없다는 것입니다 당신이 명시된 경우에만 ce 경우를 포함 할 것 스택 트레이스를 로그에 쓰거나 사용자에게 메시지를 표시하기 위해이를 사용하려고했습니다.

    throw은 체인에서 예외를 전송합니다. 호출 메소드이거나 메소드에 여러 개의 중첩 된 try/catch 블록이있는 경우 현재 try/catch 블록이 중첩 된 다음 try/catch 블록으로 예외를 보냅니다.,

    +0

    그래서 체인 (또는 다른 중첩 된 캐치)을 더 자세히 살펴보고 ce 변수를 사용하는 다른 것을 본다면 안전하게 제거 할 수 있다는 것을 알고 있습니까? –

    +0

    현재 catch 블록에 'ce'를 사용하는 것이 없으면 이름을 제거 할 수 있습니다. 스택을 확장하면 예외의 이름을 정의하는 다른 catch 블록을 발견 한 다음이를 일부 방식으로 처리 할 수 ​​있습니다. –

    1
    1. 유일한 차이점은 catch (COMException ce)에 있다는 것입니다 :

      다음은 주제에 더 읽을 수 있는지 확인하는 몇 가지 좋은 자원입니다 변수에 예외를 지정하면 catch 블록 내에서 예외에 액세스 할 수 있습니다. 그것 외에, 그것은 모든면에서 동일합니다.

    2. 여기에 어떤 질문이 있는지 잘 모르겠습니다. 예외 개체에 액세스하려면 catch 절에 변수 이름을 지정해야합니다.
    3. 예외가 발생하는 방법이나 위치에 관계없이 예외는 호출 스택을 통해 가장 가까운 일치하는 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(); 
    } 
    
    관련 문제