try catch 异常处理

C++中使用异常时应注意的问题
    任何事情都是两面性的,异常有好处就有坏处。如果你是C++程序员,
并且希望在你的代码中使用异常,那么下面的问题是你要注意的。

        1. 性能问题。这个一般不会成为瓶颈,但是如果你编写的是高性能或者实时性要求比较强的软件,
就需要考虑了。

       2. 指针和动态分配导致的内存回收问题:在C++中,不会自动回收动态分配的内存,
如果遇到异常就需要考虑是否正确的回收了内存。在java中,就基本不需要考虑这个,有垃圾回收机制。

        3. 函数的异常抛出列表:java中是如果一个函数没有在异常抛出列表中显式指定要抛出的异常,
就不允许抛出;可是在C++中是如果你没有在函数的异常抛出列表指定要抛出的异常,意味着你可以抛出任何异常。

        4. C++中编译时不会检查函数的异常抛出列表。这意味着你在编写C++程序时,
如果在函数中抛出了没有在异常抛出列表中声明的异常,编译时是不会报错的。而在java中会检查。

        5. 在java中,抛出的异常都要是一个异常类;但是在C++中,你可以抛出任何类型,
你甚至可以抛出一个整型。(当然,在C++中如果你catch中接收时使用的是对象,而不是引用的话,那么你抛出的对象必须要是能够复制的。这是语言的要求,不是异常处理的要求)。

        6. 在C++中是没有finally关键字的。而java和python中都是有finally关键字的。

捕获异常
抛出异常用throw,捕获用try……catch。

我们可以借助 C++ 异常机制来捕获上面的异常,避免程序崩溃。捕获异常的语法为:

try{
    // 可能抛出异常的语句
}catch(exceptionType variable){
    // 处理异常的语句
}

解释如下:

异常	描述
std::exception	该异常是所有标准 C++ 异常的父类。
std::bad_alloc	该异常可以通过 new 抛出。
std::bad_cast	该异常可以通过 dynamic_cast 抛出。
std::bad_exception	这在处理 C++ 程序中无法预期的异常时非常有用。
std::bad_typeid	该异常可以通过 typeid 抛出。
std::logic_error	理论上可以通过读取代码来检测到的异常。
std::domain_error	当使用了一个无效的数学域时,会抛出该异常。
std::invalid_argument	当使用了无效的参数时,会抛出该异常。
std::length_error	当创建了太长的 std::string 时,会抛出该异常。
std::out_of_range	该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。
std::runtime_error	理论上不可以通过读取代码来检测到的异常。
std::overflow_error	当发生数学上溢时,会抛出该异常。
std::range_error	当尝试存储超出范围的值时,会抛出该异常。
std::underflow_error	当发生数学下溢时,会抛出该异常。

猜你喜欢

转载自blog.csdn.net/cyy1104/article/details/131452227