std::exception
에서 맞춤 예외 클래스를 생성하는 것이 가장 이상적입니다. 이렇게하면 catch
개의 블록을 만들 때 각 예외에 대해 특정 catch
을 가질 수 있습니다. 예 :
class MyException; // Inherits from std::exception.
class MyOtherException; // Inherits from std::exception.
void foo()
{
if (bar)
throw MyException();
if (baz)
throw MyOtherException();
// do stuff.
}
int main()
{
try
{
foo();
}
catch(const MyException &ex)
{
// Handle MyException.
}
catch (const MyOtherException &ex)
{
// Handle MyOtherException.
}
}
당신이 당신의 예외에 추가 정보를 첨부 할뿐만 아니라, 전술 한 바와 같이 다른 예외 유형을 처리 할 수 있기 때문에 자신의 예외 클래스를 만들기 당신에게 더 많은 유연성을 제공한다.
코드에 대한 주된 문제점은 (최소한 어떻게 설명했는지) 그러나 예외가있는 프로그램 흐름을 제어하는 것처럼 보입니다. 예외는 빠른 구조로 설계되지 않았으므로, 처리되지 않으면 프로그램이 중단되는 예외적 인 경우를 위해 설계되었습니다. if 문 대신 예외를 사용하면 코드가 매우 느리고, 읽기가 어렵고, 이해/유지가 어려워집니다.
예를 들어 해시 테이블에 추가 할 때 테이블의 크기를 조정해야하는 이유가 있다면 크기 조정을 할 때 왜 예외가 발생해야합니까?? 이것은 정확히 std::vector
의 작동 방식입니다. vector
및 vector.capacity() < vector.size() + 1
에서 push_back()
을 수행하면 벡터는 내부적으로 버퍼를 다시 할당하여 새 항목을 추가 할 수 있습니다. 예외가 발생할 수있는 유일한 시간은 메모리가 부족한 경우입니다. 발신자가이 사실을 알지 못하면 단지 vector.push_back(...)
을 호출합니다.
일반적으로 던져 예외는 비쌉니다. 스택을 풀어야합니다. – chris
일반적으로 예외가 throw 될 때까지 오버 헤드가 발생하지 않지만 더 큰 성능 저하가 발생하는 예외가 구현됩니다. 이 경우에는 리팩토링 코드가 프로그램 로직의 일부로 예외를 던지지 않도록 제안합니다. 정말로 예외적 인 경우를 위해 저장하십시오. – UldisK
적어도 사전 정의 된 표준 예외 범주 클래스 (예 : [std :: logic_error'] (http://en.cppreference.com/w/cpp/error/logic_error) 등)에서 자신의 예외 클래스를 만듭니다. Don std :: exception'을 직접 throw하지 않으며 오류와 일치하는 카테고리가없는 한 직접적으로 상속하지 않습니다. –