2013-08-26 3 views
1

나는 그들이 단순히 필요하지 않은 많은 예외 처리 메커니즘을 보아왔다. 많은 문제가 단순한 if 문장을 사용하여 훨씬 더 깨끗한 방법으로 해결 될 수있었습니다. 예를 들어어떤 상황에서 예외 처리를 사용할 수 있습니까?

같은 것들

  • 잘못 입력
  • 분할 제로
  • 잘못된 유형으로
  • 컨테이너
  • 널 포인터
  • 초기화되지 않은 데이터
을 확인 범위

... 등등.

누군가 예외를 처리하는 더 나은 방법이 될 수있는 예를 제공 할 수 있습니까?

+0

메모리 할당에 실패했습니다. – avakar

+0

@avakar'bad_alloc'은 이미 예외이며, 우리는 그것을 잡으려고 할 수 밖에 없습니다. 나는 사용자 정의 코드에 대해 말하고있다. 언제 * 필요할 것인가? – Oleksiy

+0

하드웨어에 문제가있는 경우 프로그래밍이 포함됩니다. – Sambuca

답변

1

예외가 프로그램의 크기가 성장함에 따라 더욱 중요 해지고 : 기능 check 기능에서 예외 던지기에 foo 덕분에이 기능을 간단하게 어떤 check 반환 어떤 검사를 피할 수 있습니다.

간단한 응용 프로그램 반환 코드는 아마도 괜찮을 것입니다. 그러나 오류 조건이 처리되기 전에 몇 수준의 스택을 버블 링해야하는 경우 모든 함수에서 오류 코드를 전달하는 대신 예외를 사용하는 것이 좋습니다.

또한 메서드가 이미 값을 반환하면 실용적이지 않거나 함수에서 오류 코드를 반환 할 수도 있습니다.

+0

@Oleksiy가 "대답"으로 받아 들였지만 이것이 질문에 대답하지 않는다고 생각합니다. 지정된 요소에 대한 콜렉션을 검색 할 때 요소가 발견되지 않으면 예외를 throw하는 것이 대부분의 경우 적합하지 않습니다. "발견되지 않음"을 나타내는 리턴 코드 또는 플래그가 대부분의 경우에 더 적합합니다. 엄밀히 말하면, 결과가 a) 예외적이지는 않지만 매우 공통적 인 경우이거나 b) 실패 사례가 로컬에서 처리 될 수있는 경우 예외를 사용하지 않을 것입니다. – Onur

0

때때로 예외를 사용하는 것이 더 깨끗합니다.

#include<iostream> 
using namespace std; 

class A{ 
public: 
    int a_foo(int index){return _tab[index];}  
private: 
    static int _tab[3]; 
}; 
int A::_tab[3]={1,2,3}; 

void check(int index) 
{ 
    if (index < 0 || index > 2) 
      throw string("invalid index"); 
} 

void foo(A a, int index){ 
    check(index); 
    cout << a.a_foo(index) << endl; 
} 

int main() 
{ 
    try 
    { 
     A a; 
     foo(a,4);  
    } 
    catch(string ex) 
    { 
     cerr << ex <<'\n'; 
    } 
} 
0

예기치 않은 '이벤트'의 결과로 인해 응용 프로그램이 계속 실행되지 않을 때 사용합니다. 문제가 발생했을 때 그것을 잡았을 때 문제를 잘보고하고 응용 프로그램을 닫습니다 (또는 그 경우에는 무엇을해야한다고 생각하든).

관련 문제