【try……catch】C++ try…… catch 笔记

  • catch(CException *e) 打印异常信息

在进行各种各样的操作的时候,有时会出现未知的错误,又不知道什么类型的,一时摸不着头脑了,以前写过捕获的代码,但是用到的时候忘记了,现在记下来:

  try
 {
  MoveFile("D:\\fd.txt", "C:\\dbdw\\b.txt"); //将D:\fd.txt移动到C:\dbdw并改名为b.txt(原来目录下文件不存在)
 }
 catch(CException *e)//&e
 {
  TCHAR   szError[1024];   
  e->GetErrorMessage(szError,1024);   //  e.GetErrorMessage(szError,1024); 
  ::AfxMessageBox(szError); 
 }

那么这样就可以知道什么错误了!
  •  不经意间的内存泄露:try-catch(CException *e) [异常对象需要手动释放]

原本以为异常对象是不用手动释放的(即不用delete)

但今天发现跑了N天的服务器程序内存使用增大

在调试的时候也发现VS给出内存泄露的提示

才知道CException自带Delete方法且需要手动调用

像这样才对

try
{
	
}
catch (CException *e)
{
	e->Delete();
}

在尽量保证代码健壮性的前提下

再包上一层try-catch确实能够应对一些意外情况

但所有基于CException的异常不能直接delete

像下面的写法是错误的
try
{
	
}
catch (CException *e)
{
	delete e;
}

原文:https://blog.csdn.net/sidyhe/article/details/47400787
  • C++ try catch 捕获空指针异常,数组越界异常 

void TestEmptyPointType()  
{  
    try  
    {  
        int* p = NULL;  
        *p = 3;  
    }  
    catch(...)  
    {  
        cout<< "非法地址操作异常" << endl;  
    }  
}  
  
void TestDivZeroType()  
{  
    try  
    {  
        int b = 0;  
        int a = 3/b;  
    }  
    catch(...)  
    {  
        cout<< "0除异常" << endl;  
    }  
}  
  
void TestMemoryOutType()  
{  
    int * a = new int[4];  
    try  
    {  
        for (int i = 0; i<245; i++)  
        {  
            a++;  
        }  
        *a = 3;  
    }  
    catch(...)  
    {  
        cout<< "内存越界异常" << endl;  
    }  
}
  • C++ try catch 异常类

catch (CException *e) 的CException 就是一个类

主要

包括int、double(分别的)、exception(所有的)n等等类型。下面来超一段图表

异常类继承层级结构图如下:

每个类所在的头文件在图下方标识出来.

标准异常类的成员:

       ① 在上述继承体系中,每个类都有提供了构造函数、复制构造函数、和赋值操作符重载。

       ② logic_error类及其子类、runtime_error类及其子类,它们的构造函数是接受一个string类型的形式参数,用于异常信息的描述;

       ③ 所有的异常类都有一个what()方法,返回const char* 类型(C风格字符串)的值,描述异常信息。

    标准异常类的具体描述:



原文:https://blog.csdn.net/songzi1111/article/details/9299587

  • 异常类大全

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <fstream>
#include <memory>
#include <cstdlib>


int main(int argc, char *argv[])
{

    try
    {
        throw std::range_error("Hello Wolrd");

    } catch (std::range_error e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::underflow_error e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::overflow_error e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::length_error e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::out_of_range e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::invalid_argument e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::domain_error e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::runtime_error e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::logic_error e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::bad_cast e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::bad_alloc e)
    {
        std::cout << e.what() << std::endl;
        abort();
    } catch (std::exception e)
    {
        std::cout << e.what() << std::endl;
        abort();
    }catch(...)
    {
        std::cout<<"This fuck"<<std::endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/bandaoyu/article/details/89004444