C++-异常处理

异常处理

C++中异常处理包括:

  • throw表达式,用于引发异常,表明遇到了无法处理的问题
  • try语句块,try语句块开始,后接多个catch语句,用于处理特定的异常
  • 异常类,用于throw表达式和相关catch之间传递异常信息

throw表达式

if(condition)
{
    throw runtime_error("Error1");
}

runtime_error是一个异常类,抛出异常将终止当前函数,并从内层向外寻找能处理该异常的代码。如果找不到将执行标准库函数terminate,导致程序非正常退出

try语句块

格式如下:

try{
    program-statements
}
catch(exception-declaration){
    handler-statments
}
catch(exception-declaration){
    handler-statments
}

如:

try{
    if(condition)
    {
        throw runtime_error("Error1");
    }
}
catch (runtime_error err)
{
    cout<<err.what();
}

标准库异常类都定义了what函数,返回const char *错误信息。

标准异常类

  • exception。只报告异常不提供额外信息
  • runtime_error。
  • range_error。结果超出有意义的范围
  • logic_error。

关于try-catch的一些讨论

我个人比较认同的一些观点

最好问清楚是那种语言。不同语言处理Try Catch的机制不一样,所以也会有不同回答。比如C++,是不推荐用try catch的,它推荐使用Windows API那种HResult来返回错误情况,原因是try catch会在已有的代码上面增加额外的cost, 这个额外的cost不是说只有throw exception的时候才会有,而是在try catch block里面的每一行代码中都会有,这也是为什么他不建议你使用try catch最主要的原因。在Windows的源代码中,是没有任何try catch的,全部用HResult来处理。比如C#, try catch是建议使用的,C#设计的时候吸取的C++ try catch的教训,所以直接用Try catch包裹已有代码增加的cost可以忽略不计,但是如果真的在代码运行过程中throw exception了,这个cost还是很大的。所以,在C#代码设计中,throw exception基本上是你认为不会发生这种意外的情况下,否则,如果是常见错误,最好不要throw exception。比如Java, try catch也是建议使用的,我这个用的不熟,不过看它的说明,即使是throw exception的时候的cost也很小。总结说来,try catch是否建议使用要看具体语言,最重要衡量的标准就是它对已有的代码性能有多大的影响。但是从它设计的角度就是为了处理一些意料不到的情况,但是因为当初引入的时候各种各样的原因,导致有些语言为了性能,不推荐使用。BTW, try catch最好不要catch (Exception), 这样会吃掉不该吃的问题,比如C#中的StackOverflowException, OutOfMemoryException, NullReferenceException etc. 该crash的时候就应该让App crash, restart, 这也是保护你service的一个好方法。

只有错误可预知时才用try。所有不可预知的错误用try都是不负责任的写法

参考:

  1. https://www.zhihu.com/question/29459586

你可能感兴趣的:(C++,c++,try,catch,异常处理)