C ++에서 Java의 불법적 인 지출에 해당합니다
-
22-08-2019 - |
문제
Java에서 메소드에 대한 입력 인수가 유효하지 않은 경우 IllegalArgumentException
(유형입니다 RuntimeException
). C ++에서는 점검 및 확인되지 않은 예외라는 개념이 없습니다. 표준 C ++에서 런타임 예외를 나타내는 데 사용할 수있는 예외가 있습니까? 아니면 표준에는 공통 스타일이 없지만 모두가 이와 같은 상황에 대해 실제로 따라 갑니까?
아니면 내 자신의 사용자 지정 예외를 만들어 던져야합니까?
해결책
Java와 달리 C ++에는 "표준 프레임 워크"가 아니라 작은 (및 선택적) 표준 라이브러리 만 있습니다. 또한 C ++ 프로그래머에 따라 예외 사용 여부에 따라 다른 의견이 있습니다. 조금도.
따라서 다른 사람들의 다른 권장 사항을 찾을 수 있습니다. 일부는 표준 라이브러리에서 예외 유형을 사용하고 일부 라이브러리 (예 : POCO)는 사용자 정의 예외 계층 (STD :: 예외에서 파생)을 사용하며 다른 라이브러리는 전혀 예외를 사용하지 않습니다. (예 : QT).
표준 라이브러리를 고수하려면 전문화 된 예외 유형이 있습니다. invalid_argument
(확장 logic_error
).
#include <stdexcept>
// ...
throw std::invalid_argument("...");
참조 용 : 다음은 정의 된 표준 예외 유형에 대한 개요입니다. stdexcept
:
exception
logic_error
domain_error
invalid_argument
length_error
out_of_range
runtime_error
range_error
overflow_error
underflow_error
다른 팁
std :: domain_error는 당신이 찾고있는 것일 수 있지만, 나는 그것을 사용하는 사람이 거의 없다고 생각합니다. 대부분의 사람들은 std :: 예외에서 자신의 예외 유형을 도출합니다.
나는 항상 사용합니다 std::invalid_argument
불법적 인 주장.
유효하지 않은 경우 방법을 만족하지 못한다는 것은 예상 값을 만족시키지 못한다는 것을 의미합니다.
std::logic_error
or
std::runtime_error.
한 객체와 같은 캐스트와 관련된 것이 다른 개체로 변환 될 수 없다는 것을 의미한다면 예외는 예외는 없으며 자동으로 던져지지 않습니다.
실제로 그것은 할 것입니다. 그러나 참조에서 Dynamic_cast <>에만 해당됩니다. 던질 것입니다
std::bad_cast
나는 이것을 당신 자신으로 던지는 것이 좋은 생각인지 확실하지 않습니다.
로직 오류이기 때문에 누군가 잘못된 매개 변수를 통과 한 경우 Logic_error와 그 파생 상품을 사용하는 것이 좋습니다. 프로그래머는 잘못된 유형의 인수를 전달했습니다.
그러나 나는 그러한 경우에 내가 주장하는 것을 좋아합니다. 잘못된 값이나 유형을 기능에 전달하는 것과 같은 것은 개발 중에 만 허용 될 수 있으며 릴리스에서 그러한 점검을 피해야합니다.
표준 예외를 던지거나 직접 굴릴 수 있습니다. 당신은 당신이 던지고있는 예외에 추가 정보를 포함하고 싶을 수도 있으며, 그것은 당신 자신의 일을해야 할 좋은 이유 일 것입니다.
개인적으로, 나는 내가 작업 한 시스템에서 그러한 도메인 체크인을 보지 못했습니다. 확실히 보편적이지 않습니다.