나는 그들이 단순히 필요하지 않은 많은 예외 처리 메커니즘을 보아왔다. 많은 문제가 단순한 if
문장을 사용하여 훨씬 더 깨끗한 방법으로 해결 될 수있었습니다. 예를 들어어떤 상황에서 예외 처리를 사용할 수 있습니까?
같은 것들
- 잘못 입력
- 분할 제로
- 잘못된 유형으로
- 컨테이너
- 널 포인터
- 초기화되지 않은 데이터
... 등등.
누군가 예외를 처리하는 더 나은 방법이 될 수있는 예를 제공 할 수 있습니까?
나는 그들이 단순히 필요하지 않은 많은 예외 처리 메커니즘을 보아왔다. 많은 문제가 단순한 if
문장을 사용하여 훨씬 더 깨끗한 방법으로 해결 될 수있었습니다. 예를 들어어떤 상황에서 예외 처리를 사용할 수 있습니까?
같은 것들
... 등등.
누군가 예외를 처리하는 더 나은 방법이 될 수있는 예를 제공 할 수 있습니까?
예외가 프로그램의 크기가 성장함에 따라 더욱 중요 해지고 : 기능 check
기능에서 예외 던지기에 foo
덕분에이 기능을 간단하게 어떤 check
반환 어떤 검사를 피할 수 있습니다.
간단한 응용 프로그램 반환 코드는 아마도 괜찮을 것입니다. 그러나 오류 조건이 처리되기 전에 몇 수준의 스택을 버블 링해야하는 경우 모든 함수에서 오류 코드를 전달하는 대신 예외를 사용하는 것이 좋습니다.
또한 메서드가 이미 값을 반환하면 실용적이지 않거나 함수에서 오류 코드를 반환 할 수도 있습니다.
@Oleksiy가 "대답"으로 받아 들였지만 이것이 질문에 대답하지 않는다고 생각합니다. 지정된 요소에 대한 콜렉션을 검색 할 때 요소가 발견되지 않으면 예외를 throw하는 것이 대부분의 경우 적합하지 않습니다. "발견되지 않음"을 나타내는 리턴 코드 또는 플래그가 대부분의 경우에 더 적합합니다. 엄밀히 말하면, 결과가 a) 예외적이지는 않지만 매우 공통적 인 경우이거나 b) 실패 사례가 로컬에서 처리 될 수있는 경우 예외를 사용하지 않을 것입니다. – Onur
때때로 예외를 사용하는 것이 더 깨끗합니다.
#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';
}
}
예기치 않은 '이벤트'의 결과로 인해 응용 프로그램이 계속 실행되지 않을 때 사용합니다. 문제가 발생했을 때 그것을 잡았을 때 문제를 잘보고하고 응용 프로그램을 닫습니다 (또는 그 경우에는 무엇을해야한다고 생각하든).
메모리 할당에 실패했습니다. – avakar
@avakar'bad_alloc'은 이미 예외이며, 우리는 그것을 잡으려고 할 수 밖에 없습니다. 나는 사용자 정의 코드에 대해 말하고있다. 언제 * 필요할 것인가? – Oleksiy
하드웨어에 문제가있는 경우 프로그래밍이 포함됩니다. – Sambuca