>

다음 예를 고려하십시오 ( 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

    BOOST_THROW_EXCEPTION  항상 boost::exception 를 상속하는 것 외에도 인수의 유형을 상속하는 유형을 던집니다. . 이것은 두 가지를 의미합니다 :

    <올>

    와이즈 비즈   dynamic_cast 에서  전달 된 유형으로.

    -

    boost::exception
    
    

    전달 된 유형을 직접 잡을 수 있습니다. 그러나 슬라이싱을 피하려면 항상 참조로 잡아야합니다. (이 조언은 부스트를 사용하든 다른 것을 사용하든 상관 없습니다.)

    -

    catch (boost::exception &e)
    {
        std::cerr << *boost::get_error_info<errmsg_info>(e);
        if ( allocation_failed* af = dynamic_cast<allocation_failed*>(&e) )
        {
            std::cerr << af->what() << std::endl; // redundant
        }
    }
    
    

    물론, 이런 식으로 부스트의 오류 형식이나 추가 데이터를 원한다면 catch (A& a) { // ... } catch (B& b) { // ... } catch (C& c) { // ... } 가 필요합니다.   dynamic_cast 에 대한 예외 객체 .

    boost::exception*

  • 이전 php - 워드 프레스 paginate_links () 사용자 정의
  • 다음 python - 달러 통화에 대한 정규 표현식을 지정하는 방법은 무엇입니까?