gpt4 book ai didi

c++ - 尝试使用 RAII 捕获?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:32 26 4
gpt4 key购买 nike

我有一个类,其中有一些方法如下(以及更多):

    template<class T>
Logpp& operator<<(T const& obj)
{
*p_Stream << obj ;
return *this ;
}

Logpp& operator<<(char const* zString)
{
*p_Stream << zString ;
return *this ;
}

Logpp& operator<<(std::ostream& (*manip)(std::ostream&))
{
*p_Stream << manip;
return *this ;
}

我想将函数体包含在以下形式的 try catch block 中:

    Logpp& operator<<(std::ostream& (*manip)(std::ostream&))
{
try
{
*p_Stream << manip;
return *this;
}
catch(ios_base::failure& e)
{
//MyException has a stringstream inside and can use operator<<
throw MyException("IO failure writing to log file : ") << e.what() << endl;
}
}

Q1:是否建议使用这样的异常? (在每个函数中)。我不熟悉使用异常,所以我不确定。

问题 2:如果问题 1 的答案是肯定的,我可以做这样的事情来消除冗余吗?

    Logpp& operator<<(std::ostream& (*manip)(std::ostream&))
{
Catch<ios_base::failure> tc();
try
{
*p_Stream << manip;
return *this;
}
//destructor of tc will be written to catch the template exception type and rethrow as a MyException.
}

最佳答案

Q1: Is it advisable to use exceptions like this? (In each function). I am not familiar using exceptions so I am not sure.

没有特别的问题,但也没有特别的原因,除非你计划丰富异常信息,将一些 ios_base::failure 函数与其他函数区分开来等等。你只想让每个函数更大/更复杂,如果它使其他更小/更简单的东西。

Q2: If the answer to Q1 is positive, can I do something like this to remove redundancies?

您可能会使用宏来为您生成 try/catch block 。如果您按照您的建议进行操作,则在处理异常时将调用析构函数:如果您尝试再次抛出,则将调用 terminate()。查看 C++ Lite FAQ 了解详细信息:http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.9

关于c++ - 尝试使用 RAII 捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4954448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com