我是靠谱客的博主 甜甜枕头,最近开发中收集的这篇文章主要介绍C++ 关于异常捕获的槽点,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

可能用到的头文件先列出来:

#include <vector>
#include <exception>
#include <excpt.h>  
#include <cassert>
#include <windows.h>
using namespace std;

本来想要一个像.net那样的异常捕获try{}catch(Exception ex){//"几乎能够捕获各种异常,只需要将ex里面的信息写到日志里面就行了,看看日志就知道问题大概在哪里"};感觉.net还是挺方便的与是相当然的想在C++的项目里也这样做,然后发现事实并不行。

首先,C++里面的异常类关系是这样的

详细的说明可以看菜鸟教程,我经常看。哈哈哈哈。

C++ 异常处理 | 菜鸟教程

我的目的就是把异常写到本地日志,所以我就不关心这么多继承了,直接使用基类std::exception;

记得添加#include<exception>;

于是,我写了下面的代码:

int a=0;
int b=2;
int c=b/a;//0不能作为分母,这里肯定会抛出异常,来捕获它吧

神奇的事情发生了,没有捕获到异常。

是我.net思想太严重了。于是,使用了下面的代码,但是,不满足我的需求啊

try {
		int a = 0;
		int b = 2;
		int c = b / a;//0不能作为分母,这里肯定会抛出异常,来捕获它吧
	}
	catch (...) {
		//这里我获取不到有用的异常提示信息啊,我该向日志里写啥呢?
	}

以上代码确实可以捕获到异常但是还是先进行一个项目属性的设置,注意是项目属性:

还有我也不知道应该把什么异常信息写给日志。

所以,这样肯定是不行的。但是,有些异常时可以的,例如:

try
	{
		v.at(100) = 100;  //拋出 out_of_range 异常
	}
	catch (const std::exception& e)
	{
		//里面有异常信息是这样的:invalid vector subscript;这个信息还算有点用
        std::string meg=e.what();
	}

我的日志是需要给std::exception 类型的参数的,所以你必须给我这个类型的对象。那对于不能捕获到异常的除零这样的怎么办呢?

于是,我自己做了一个继承std::exception 类的自定义异常类并重写了what();如下:

这是用的类:

class MyException:public std::exception
{
public :
	MyException();
	~MyException();
	const char* what() const noexcept /*noexcept*/ override { return "发生异常了"; }
};
MyException::MyException()
{

};
MyException::~MyException()
{

};

使用结构体也可以:

struct MyException: std::exception {
	const char* what() const noexcept { return "发生异常了"; }
};

无论是类还是结构体对exception做了继承。用法都如下:

try
	{
	    int a = 0;
		int b = 2;
		if (a==0)
		{
            //用惯了.net真心不能接受这样的设计,都判断出来了还抛异常干嘛呢?但是为了写到日志里
            //也是改变自己了
			throw MyException();
		}
        //因为上面throw了,这里就不会走了
		int c = b / a;//0不能作为分母,上面提前捕获了
	}
	catch (const std::exception& e)
	{
       //成功进到这里并且还是exception类型,meg就是上面重写的值。
		std::string meg=e.what();
	}

到此为止,已经满足我写日志的需求了。但是,需要开发者去重写exception,还是知道在哪里需要抛出异常,还需要自己设置异常信息。

下面做个优化给MyException加了一个构造的重载:

class MyException :public std::exception
{
public:
	MyException();
	MyException(std::string _meg);
	~MyException();
	const char* what() const noexcept /*noexcept*/ override { return meg.c_str(); }
private:
	string meg;
};
MyException::MyException()
{

};

MyException::MyException(std::string _meg)
{
   //设置异常提示信息
	meg = _meg;
};

MyException::~MyException()
{

};

这样使用重载的构造函数就可以动态设置异常的提示信息了。

最后

以上就是甜甜枕头为你收集整理的C++ 关于异常捕获的槽点的全部内容,希望文章能够帮你解决C++ 关于异常捕获的槽点所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部