2009-11-25 4 views
2

최근에 저는 맞춤 usb 장치를 사용할 .net 프로그램을 리팩터링하고 있습니다. 장치에는 통신을위한 dll이 함께 제공됩니다. dll은 c로 작성되고 헤더를 검사하여 오류 리턴 코드 세트를 정의합니다.예외 또는 오류 코드 열거 형

장치로 미세화하기위한 첫 번째 단계는 장치를 여는 것입니다.

// Return true if succeed. Throw exception if there is error. 
bool Open() 
{ 
    int flag = DLL_Open(); 
    if(flag == OK) return true; 
    else 
    { 
     if(flag == ERROR_CANNOT_CLAIM_INTERFACE) 
      throw USBException(); 
     // ... 
    } 
} 

내 질문은, 왜 예외를 대신 사용하려면, 오류 코드에 대한 예외를 사용하고 그물 프로그램에서

// return different codes, such as OK, ERROR_CANNOT_CLAIM_INTERFACE, etc. 
int DLL_Open(); 

: DLL에

는 오픈 기능은 다음과 같습니다 단순히 dll API로 오류 코드를 사용 하시겠습니까? "응용 프로그램 흐름을 제어하는 ​​예외를 사용하지 마십시오"언급 한 일부 기사를 읽고 여기에 예외가 흐름을 제어하는 ​​것과 같은 종류라고 생각합니다.

답변

1

더 나은 성능과 예외를 제공하는 열거 형 (시스템 경계를 넘어)에서 더 나은 디커플링을 잠재적으로 제공하는 두 가지 솔루션이 모두 작동합니다. 실제로는 소프트웨어 설계 및 협약의 문제입니다. 작업중인 시스템의 기능 범위에 주어진 오류 조건 처리가 포함되지 않은 경우 기본적으로 예외를 사용하십시오.

이 .NET 프로그램에 고유 한 UI가있는 경우 예외를 throw 할 필요가 없습니다. 열거 형을 사용하고 사용자에게 오류를 표시하십시오. 반면에이 .NET 프로그램이 타사에서 사용하는 어셈블리 인 경우 API에서 오류 코드 나 열거 형을 노출하지 않고 대신 예외를 throw (및 문서화)하는 것이 더 일반적이라고 간주됩니다.

중간에이 프로그램은 자신의 UI가 없지만 사용자 (또는 조직의 누군가)가 제어 할 수있는 다른 시스템에서 사용하게 될 것입니다. 이 경우 더 나은 성능을 제공하는 열거 형과 더 나은 디커플링을 제공하는 예외를 통해 어느쪽으로 갈 수 있습니다.

1

리턴 코드는 실행 흐름에 영향을주지 않습니다. 당신은 반환 코드를 무시할 자유가 있지만, 예외는 적극적으로 포착되고 무시되어야합니다.

충분히 나쁜 것이 발생하여 해당 구성 요소 (또는 하위 구성 요소 등)를 계속 사용할 수없는 예외를 사용합니다. 일부 수정 조치없이 -이 경우 USB 스틱을 연결합니다. .

이 제어 프로그램이 흐르고 있습니까? 분명히 예 (어떤 예외도 마찬가지 임). 그러나 유효한 질문은 입니다. 얼마나 특별합니까??

0

예외는 오류를 적절히 처리하는 방법이며 다른 양식 (예 : GOTO)을 사용할 수는 있지만 좋지 않습니다. 또한 컨트롤 흐름을 사용하지 않는다는 생각에 동의하지 않습니다 ... 분명히 말하지만 내가 말하는 흐름은 매우 낮은 침입 흐름입니다. 예외를 기반으로 모든 의사 결정을 정렬해야하지만, 특정 종류의 예외에 따라 조치와 흐름. 또한 오류를 버블 링하는 좋은 방법입니다.

0

매우 간단한 질문입니다. 일반적인 프로그램 흐름이 발생합니까?

예외로 제어되는 코드의 표준 조건부 로직을 원하지 않지만 실제 오류 케이스 인 경우 다른 한편으로는 적절하게 유형화 된 예외를 던지는 것이 가장 좋은 방법입니다. 이벤트가 함수 호출의 예상 결과인지 드문 경우입니다.때로는 둘 다 수행하고 예상 결과를 enum으로 노출하지만 실제 오류를 예외로 두는 경우도 있습니다.

성능 측면에서 볼 때 예외 모델은 처리 능력을 크게 향상 시키지만 예외가 발생할 경우에만 사용됩니다. 오류가 없다면 실제로 열거 형을 사용하는 것보다 빠릅니다. 이 성능을 실제로보고 싶다면 Int32.Parse 대 Int32.TryParse에 대한 정보를 찾는 것이 아마도 가장 많은 정보를 가지고있을 것입니다. (처음에는 예외 모델을 사용했고 사람들은 정기적으로 성능 향상을 위해 두 번째를 추가했습니다. 검증되지 않은 데이터).

0

단순히 dll API로 오류 코드를 사용하는 대신 예외를 사용하는 이유는 무엇입니까?

이 예에서는 예외를 사용할 이유가 없습니다.

Open 메서드에서 enum OpenResult { Openned, DLLFailed }을 그냥 반환하십시오. 이것은 Open 메서드의 호출자가 어떤 일이 일어 났는지 이해하고 그에 따라 행동하기에 충분합니다.