C++异常处理问题

kay*_*kun 3 c++ winapi

1)为方便起见,我将整个程序放在try块中.这样我就可以在代码中的任何一点抛出异常,并知道它将以相同的方式处理.随着程序变得更大,这种技术会导致性能下降吗?

2)如果在超出范围时取消分配对象,为什么抛出临时对象有效?例如:

class Error : public std::exception  
{
  private:
    char *m;
  private:
    Error(char *l) : m(l) {}
    virtual char *what()
    {
      return m;
    }
};

int main()
{
  try
  {
    throw Error("test");
  }
  catch(std::exception &e)
  {
    puts(e.what());
    return -1;
  }
  return 0;
}

在throw语句中,为什么临时对象不会变为无效,因为它只在try范围中声明?

3)对于非英语语言的Windows操作系统,what()STL异常类的成员是否仍会返回char*字符串?或者它可以返回一个wchar_t*字符串?

Mar*_*som 10

从技术上讲,你不抛出实际的对象,你抛出它的副本.这就是为什么你可以放弃一个临时的.捕获引用也会获得对副本的引用.

如果你从catch块中重新抛出异常,这可能会让你感到困惑,你可能成为切片问题的牺牲品.这就是你不这样做的原因:

catch (std::exception & e)
{
    throw e;  // bad, always throws std::exception rather than what was caught
}
Run Code Online (Sandbox Code Playgroud)

反而

catch (std::exception & e)
{
    throw;  // good, rethrows the exact copy that you caught without making another copy
}
Run Code Online (Sandbox Code Playgroud)

PS没有规则说你不能从中返回UTF-8字符串what.您可以将它转换为Windows I/O的UTF-16.标准异常类从未为Unicode明确设计或扩展,也没有为Windows添加任何非标准扩展.