正在重新引发指针捕获的异常 在C++中,下面的例子有什么不同?

正在重新引发指针捕获的异常 在C++中,下面的例子有什么不同?,c++,exception,C++,Exception,重新抛出指针: catch (CException* ex) { throw ex; } catch (CException* ex) { throw; } 简单的重新抛出: catch (CException* ex) { throw ex; } catch (CException* ex) { throw; } 捕获重新抛出时,堆栈跟踪是否会不同?是。基本上,在第一种情况下,你是在自己扔东西。看起来您自己在throw ex行中生成了异常。在第二种情况下

重新抛出指针

catch (CException* ex)
{
    throw ex;
}
catch (CException* ex)
{
    throw;
}
简单的重新抛出

catch (CException* ex)
{
    throw ex;
}
catch (CException* ex)
{
    throw;
}

捕获重新抛出时,堆栈跟踪是否会不同?

是。基本上,在第一种情况下,你是在自己扔东西。看起来您自己在
throw ex
行中生成了异常。在第二种情况下,您只是让原始对象在调用堆栈中上升(从而保留原始调用堆栈),它们是不同的。通常,您应该使用
throw

是。基本上,在第一种情况下,你是在自己扔东西。看起来您自己在
throw ex
行中生成了异常。在第二种情况下,您只是让原始对象在调用堆栈中上升(从而保留原始调用堆栈),它们是不同的。通常,您应该使用
throw

我认为性能有差异。第二个版本不会生成异常的临时副本。第一个将创建一个副本,因此seond是一种方法


您可以创建一个简单的异常类并进行尝试,让构造函数/复制构造函数在触发时打印到控制台。这样你就可以看到不同了。

我认为这是性能上的差异。第二个版本不会生成异常的临时副本。第一个将创建一个副本,因此seond是一种方法


您可以创建一个简单的异常类并进行尝试,让构造函数/复制构造函数在触发时打印到控制台。这样你就可以看到区别了。

在第一种情况下不会构造副本,因为指针正在被抛出。我读到他说指针被复制了。他想知道为什么他认为这会对表现产生影响。现在我明白他在想什么了。是的,只有指针被复制是错误的,复制可以省略。在第一种情况下不会构造副本,因为指针被抛出。我读了他说的指针被复制。他想知道为什么他认为这会对表现产生影响。现在我明白他在想什么了。是的,只有指针被复制是错误的,复制可以省略。作为旁注,除非库强制,否则最好不要用指针捕捉旁注,除非库强制,否则最好不要用指针捕捉