波奇学C++

C语言处理异常有assert和返回错误码两种方式,C++新添加了异常的属性。

异常通过对象抛出,抛出异常没捕获就会报错

double Division(int a, int b)
{
    if (b == 0)
        //抛出异常
        throw"Division by zero condition!";
    else
        return ((double)a) / ((double) b);
}
void Func()
{
    int len, time;
    cin >> len >> time;
    cout << Division(len, time) << endl;
}
int main()
{
    try {
        Func();
    }
    // catch会捕获所有func()调用栈帧的异常
    catch (const char* errmsg)
    {
        cout << errmsg << endl;
    }
    return 0;
}

注意捕获异常的参数和抛出的异常相同,如果不同就不会捕获。

int main()
{
    try {
        Func();
    }
    // catch会捕获所有func()调用栈帧的异常
    catch (int errmsg)
    {
        cout << errmsg << endl;
    }
    return 0;
} //不会打印信息,参数类型不同,捕获不到异常

 多个catch语句可以捕获多个异常

try {
		Func();
	}
	// catch会捕获所有func()调用栈帧的异常
	catch (int errmsg)
	{
		cout << errmsg << endl;
	}
	catch (const char* errmsg)
	{
		cout << errmsg << endl;
	}

抛出的异常会通过栈帧层层返回,直到被捕获,如果没有被捕获,就会终止程序

void Func()
{
	try {
		int len, time;
		cin >> len >> time;
		cout << Division(len, time) << endl;
	}
	catch (const char* msg)
	{
		cout << msg << endl;
		cout << "fun捕获";
	}
	
}//异常在fun中被捕获了。不会被main()捕获

异常捕获后,Fun()的catch后的代码继续执行。

try{}
catch(...)
{}

catch(...)可以捕获所有异常

一般服务器开发的异常通常使用异常继承体系,异常是一个自定义结构体,包含错误id和错误信息。抛出的对象是对象的拷贝,可能是一个临时对象

class Exception
{
public:
	Exception(const string& errmsg, int id)
		:_errmsg(errmsg)
		, _id(id)
	{}
	virtual string what()const
	{
		return _errmsg;
	}
protected:
	string _errmsg;
	int _id;
};

C++中抛派生类异常用基类捕获。

catch内部可以在捕获异常,再抛出

try{}
catch(...)
{
throw;
}

你可能感兴趣的:(波奇学c,c++,算法,开发语言)