홈>
다음 예를 고려하십시오 ( https://theboostcpplibraries.com/boost.exception 에서 가져옴)
#include <boost/exception/all.hpp>
#include <exception>
#include <new>
#include <string>
#include <algorithm>
#include <limits>
#include <iostream>
typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info;
struct allocation_failed : public std::exception
{
const char *what() const noexcept { return "allocation failed"; }
};
char *allocate_memory(std::size_t size)
{
char *c = new (std::nothrow) char[size];
if (!c)
BOOST_THROW_EXCEPTION(allocation_failed{});
return c;
}
char *write_lots_of_zeros()
{
try
{
char *c = allocate_memory(std::numeric_limits<std::size_t>::max());
std::fill_n(c, std::numeric_limits<std::size_t>::max(), 0);
return c;
}
catch (boost::exception &e)
{
e << errmsg_info{"writing lots of zeros failed"};
throw;
}
}
int main()
{
try
{
char *c = write_lots_of_zeros();
delete[] c;
}
catch (boost::exception &e)
{
std::cerr << *boost::get_error_info<errmsg_info>(e);
}
}
allocate_memory()
기능
다음 문장을 사용하여 예외가 발생합니다
BOOST_THROW_EXCEPTION(allocation_failed{});
캐치 블록에서
boost::exception &e
를 어떻게 변환 할 수 있습니까
다시
allocation_failed
로
?
또한 내 코드에
BOOST_THROW_EXCEPTION(A{})
와 같은 여러 개의 throw 문이있는 경우
,
BOOST_THROW_EXCEPTION(B{})
,
BOOST_THROW_EXCEPTION(C{})
등. 여기서 A, B, C는 클래스입니다. 부스트를 사용하지 않으면 다음과 같은 방식으로 각 예외 유형에 대해 별도의 catch 블록을 가질 수 있습니다.
...
catch(A e){
...
}
catch(B e){
...
}
catch(C e){
...
}
부스트를 사용할 때 어떻게 똑같이 할 수 있으므로
BOOST_THROW_EXCEPTION(A{})
,
BOOST_THROW_EXCEPTION(B{})
,
BOOST_THROW_EXCEPTION(C{})
등 다른 캐치 블록으로 이동합니까?
라이브러리를 향상시키는 것은 처음이며 그 개념 중 일부는 저를 피합니다.
-
답변 # 1
관련 질문
- c++ - boost - : python 가져 오기 기능이 "위치 읽기 액세스 위반"으로 실패 함
- c++ - 헤더 전용 부스트 라이브러리의 하위 집합 만 내보내는 방법은 무엇입니까?
- c++ - 방문자 사용시 변형 변환 오류 향상
- c++ - 클러스터 get 프로세스 ID가있는 노드 애드온은 모든 분기 된 프로세스에 대해 동일한 ID를 반환합니다
- c++ - b2 설치 명령이 실행되지 않음
- c++ - UDP 멀티 캐스트가 Linux Debian에서 작동하지 않습니다
- c++ - Boost Property Tree가 사용하는 데이터 유형을 어떻게 결정할 수 있습니까?
BOOST_THROW_EXCEPTION
항상boost::exception
를 상속하는 것 외에도 인수의 유형을 상속하는 유형을 던집니다. . 이것은 두 가지를 의미합니다 :와이즈 비즈
dynamic_cast
에서 전달 된 유형으로.-
전달 된 유형을 직접 잡을 수 있습니다. 그러나 슬라이싱을 피하려면 항상 참조로 잡아야합니다. (이 조언은 부스트를 사용하든 다른 것을 사용하든 상관 없습니다.)
-
물론, 이런 식으로 부스트의 오류 형식이나 추가 데이터를 원한다면
catch (A& a) { // ... } catch (B& b) { // ... } catch (C& c) { // ... }
가 필요합니다.dynamic_cast
에 대한 예외 객체 .boost::exception*