自己设计C++完善的异常处理类

作者:小菜 更新时间:2025-02-25 点击数:
简介:我们的异常处理类的features 如何写一个异常处理类是一个不太容易的事情,最近刚好接触了一些不错的代码,看到了一些技巧,这里和大家分享一下。

一个相对完善的异

【菜科解读】

我们的异常处理类的features

如何写一个异常处理类是一个不太容易的事情,最近刚好接触了一些不错的代码,看到了一些技巧,这里和大家分享一下。

一个相对完善的异常处理类(以及附加的一些东西)应该能够处理下面的一些功能:

1) 能够方便的定义异常类的继承树

2) 能够方便的throw、catch,也就是在代码中捕获、处理代码的部分应该更短

3) 能够获取异常出现的源文件的名字、方法的名字、行号

4) 能够获取异常出现的调用栈并且打印出来

由于目前我用的平台是linux,所以里面调用的一些函数也只是在linux下面有用。

Windows也肯定是具有相应的函数的,具体可能需要去查查

首先科普一些内容:

1) 对于没有捕获的异常(no handler),则会终止程序,调用terminate()

2) 在定义函数的时候,我们可以在定义的后面加上throw (exception1, exception2…):

a) 如果没有写这一段、则可能抛出任意的异常

b) 如果写throw(),则表示函数不能抛出任意的异常

c) 如果写throw(A, B), 表示函数抛出A、B的异常

如果抛出的异常不在列表范围内,则异常不能被catch,也就会调用terminate()

我们构想一下我们定义、调用我们的异常类的时候是怎样的一个情形:

1) 定义:

1:class DerivedException : public BaseException

2: {

3:public:

4: MY_DEFINE_EXCEPTION(DerivedException, BaseException);

5: };

2) 如何抛出异常

1: MY_THROW(DerivedException)

3) 如何catch异常

1:catch (DerivedException& e)

2: {

3: cout

5:#include

6:

7:#define MY_THROW(ExClass, args...) \

8:do \

9: { \

10: ExClass e(args); \

11: e.Init(__FILE__, __PRETTY_FUNCTION__, __LINE__); \

12:throw e; \

13: } \

14:while (false)

15:

16:#define MY_DEFINE_EXCEPTION(ExClass, Base) \

17: ExClass(const std::string& msg = "") throw() \

18: : Base(msg) \

19: {} \

20: \

21: ~ExClass() throw() {} \

22: \

23:/* override */ std::string GetClassName() const \

24: { \

25:return #ExClass; \

26: }

27:

28:class ExceptionBase : public std::exception

29: {

30:public:

31: ExceptionBase(const std::string& msg = "") throw();

32:

33:virtual ~ExceptionBase() throw();

34:

35:void Init(constchar* file, constchar* func, int line);

36:

37:virtual std::string GetClassName() const;

38:

39:virtual std::string GetMessage() const;

40:

41:constchar* what() constthrow();

42:

43:const std::string& ToString() const;

44:

45: std::string GetStackTrace() const;

46:

47:protected:

48: std::string mMsg;

49:constchar* mFile;

50:constchar* mFunc;

51:int mLine;

52:

53:private:

54:enum { MAX_STACK_TRACE_SIZE = 50 };

55:void* mStackTrace[MAX_STACK_TRACE_SIZE];

56: size_t mStackTraceSize;

57:mutable std::string mWhat;

58: };

59:

60:class ExceptionDerived : public ExceptionBase

61: {

62:public:

63: MY_DEFINE_EXCEPTION(ExceptionDerived, ExceptionBase);

64: };

65:

66:#endif

这个头文件首先定义了两个宏,这里先暂时不管他,我先来解释一下ExceptionBase,它继承自std::exception,std::exception里面其实已经提供了一些功能了,但是比较弱,为了实现我们上文提到的功能,这里只是继承了std:exception的借口,也就是what()函数。

上面的接口应该比较好理解,45行的GetStackTrace是打印当前的调用栈,49-51行分别存储了当前出现exception的源文件名,函数名,行号,54行定义了最大的调用栈显示的深度,也就是显示50行。

60行显示了怎样定义一个新的异常类,这个就很方便了,通过MY_DEFINE_EXCEPTION宏去定义了一个继承类,详情见16行,这里不再细说,我这里想说说7行的MY_THROW宏,使用了3个内置的参数,__FILE__, __LINE__, __PRETTY_FUNCTION__, 他们分别是当前的文件名,行号,和函数名,他们的使用方法是在哪儿出现,其相应的值就是什么。

为什么这里要使用MY_THROW宏呢?其实是为了方便的把行号、文件名等加入进来,宏展开的时候是在一行上的,这样也使得行号与出错的行号保持一致,而且让代码更简单。

给出异常类的.cpp文件:

1:#include

2:#include

3:#include

4:

5:#include

6:#include

7:

8:#include"exception_test.h"

9:

10:usingnamespace std;

11:

12: ExceptionBase::ExceptionBase(const std::string& msg) throw()

13: : mMsg(msg),

14: mFile(""),

15: mFunc(""),

16: mLine(-1),

17: mStackTraceSize(0)

18: {}

19:

20: ExceptionBase::~ExceptionBase() throw()

21: {}

22:

23:void ExceptionBase::Init(constchar* file, constchar* func, int line)

24: {

25: mFile = file;

26: mFunc = func;

27: mLine = line;

28: mStackTraceSize = backtrace(mStackTrace, MAX_STACK_TRACE_SIZE);

29: }

30:

31: std::string ExceptionBase::GetClassName() const

32: {

33:return"ExceptionBase";

34: }

35:

36:constchar* ExceptionBase::what() constthrow()

37: {

38:return ToString().c_str();

39: }

40:

41:const std::string& ExceptionBase::ToString() const

42: {

43:if (mWhat.empty())

44: {

45: stringstream sstr("");

46:if (mLine > 0)

47: {

48: sstr \n";

71:char** strings = backtrace_symbols(mStackTrace, 10);

72:if (strings == NULL) // Since this is for debug only thus

73:// non-critical, don't throw an exception.

74:return"\n";

75:

76: std::string result;

77:for (size_t i = 0; i 自己,设计,C++,完善,的,异常,处理,类,我们,的,

五险一金扣多少钱一个月五险一金可以自己交吗

公司社保就是我们日常说的五险,包括包括养老保险、医疗保险、失业保险、工伤保险和生育保险。

其中养老保险、医疗保险和失业保险,这三种险是由企业和个人共同缴纳的保费,工伤保险和生育保险完全是由企业承担的。

五险一金扣多少钱一个月?渭南社保缴纳比例公司和个人按照以下方式计算?:养老保险:企业缴纳比例:20%,个人缴纳比例:8%。

医疗保险:单位缴费费率为8%,职工个人缴费费率为2%。

失业保险:失业人员符合下列条件的,从失业保险基金中领取失业保险金:(一)失业前用人单位和本人已经缴纳失业保险费满一年的;(二)非因本人意愿中断就业的;(三)已经进行失业登记,并有求职要求的。

失业人员在领取失业保险金期间,参加职工基本医疗保险,享受基本医疗保险待遇。

失业人员应当缴纳的基本医疗保险费从失业保险基金中支付,个人不缴纳基本医疗保险费。

工伤保险的缴费比例主要是看职工从事的行业的风险程度,而根据工伤风险程度,行业主要可以划分为三类。

风险较小行业:工伤保险缴费比例基本是在其单位职工工资总额的0.5%左右。

中等风险行业:工伤保险缴费比例是在其单位职工工资总额的1.0%左右。

风险较大行业:工伤保险缴费比例是在其单位职工工资总额的2.0%左右。

生育保险比例:单位1.2%,个人不缴纳 根据相关法规要求,住房公积金的缴纳比例由单位和个人共同承担,通常可以在5%至12%的范围内自由选择。

这意味着,职工和单位住房公积金的最低缴存比例各为5%,最高比例为12%。

有条件的城市,还可以根据当地实际情况适当提高缴存比例,但一般不超过12%。

新社通APP社保计算器,一键算出您的社保缴费明细!新社通社保计算器计算所得,数据仅供参考。

五险一金可以自己交吗?个人是可以自己交社保的。

缴纳社保费方法:1、凭身份证等有效证件到社会保险经办机构合作银行柜面缴纳;2、直接到参保的社保经办机构缴纳;3、通过社保经办机构或者合作银行推出的官网APP缴纳;4、到合作银行或者社保经办机构推出的自助终端自助缴纳;5、其他。

个人参加的社保为居民社保(包括新农合、新型农村社会养老保险、城镇居民基本医疗保险和城镇居民社会养老保险)和灵活就业社保(仅限于职工社保中的基本医疗保险和基本养老保险)。

城乡居民社保一年缴费一次,具体时间询问当地人社局;灵活就业社保可以选择按年缴纳或者按月缴纳,大部分灵活就业人员都是按月缴纳。

交社保,就是为了让老百姓在老了、病了、受伤了、失业了或者生孩子时,能从社会得到帮助。

社保具体作用是:提供基本的社会保险:社保体系能够保证个人及其家庭的基本生活。

当参保公民遭遇年老、疾病、生育、工伤、失业等风险时,能够为其给予物质帮助、减少经济损失、其基本的生活。

促进经济发展:社保保险不仅可以让劳动人员奋斗更有动力,以提高产品的生产效率,还能够减轻个人的经济负担,从而提高个人的消费能力,促进社会经济发展。

维护社会稳定:社保体系的实施可以维护社会稳定。

社保体系可以减轻个人负担,提高个人生活水平,减少社会矛盾。

(备注:数据仅供参考,具体以当地有关法规为准)

自己缴社保和单位缴社保的分别是什么

个人缴纳社保和公司缴纳有什么区别,随新社通App小编一起了解一下自己缴社保和单位缴社保的区别详情吧。

险种覆盖?个人缴纳社保?:一般只能缴纳养老保险和医疗保险。

灵活就业人员无法享受失业、工伤和生育保险的待遇。

?公司缴纳社保?:通常包括养老保险、医疗保险、失业保险、工伤保险和生育保险。

这些险种由公司统一缴纳,员工个人只需承担一小部分费用。

?缴费基数?个人缴纳社保?:缴费基数可以选择,通常在当地上年度社会平均工资的60%至300%之间。

?公司缴纳社保?:缴费基数通常按照员工上一年度月平均工资计算,如果工资低于当地平均工资的60%,则按照60%计算,高于300%则按照300%计算。

?缴费比例?个人缴纳社保?:养老保险需要个人承担20%,医疗保险也需要个人承担8%-10%。

?公司缴纳社保?:养老保险公司承担16%,员工个人承担8%;医疗保险公司承担8%-10%,员工个人承担2%左右。

?缴纳方式?个人缴纳社保?:需要自行前往社保经办机构办理参保登记和缴费手续,可以选择按月、按季或按年缴纳。

?公司缴纳社保?:由公司人事统一办理参保登记和缴费手续,费用从员工工资中扣除。

退休年龄?个人缴纳社保?:男性通常60岁退休,女性统一为55岁退休。

?公司缴纳社保?:男性通常60岁退休,女性工人50岁退休,女性干部55岁退休。

享受的待遇?公司缴纳社保?:员工可以享受养老保险、医疗保险、失业保险、工伤保险和生育保险的待遇。

?个人缴纳社保?:主要享受养老保险和医疗保险的待遇,无法享受失业、工伤和生育保险的待遇。

社保交够多少年才有退休金?法定退休年龄根据不同人群和工种有所不同。

通常情况下,男性职工的法定退休年龄是60周岁,女性干部的法定退休年龄是55周岁,女性工人的法定退休年龄是50周岁。

然而,对于从事井下、高空、高温、特别繁重体力劳动或其他有害身体健康的工作的职工,退休年龄有所提前。

具体为男职工年满55周岁、女职工年满45周岁。

此外,如果职工因病或非因工致残,由医院证明并经有关部门确认完全丧失劳动能力的,退休年龄为男年满50周岁、女年满45周岁。

请注意,退休年龄的具体法规可能会根据方案调整而有所变化,建议您咨询当地社保部门或人力资源部门以获取最准确的信息。

(备注:数据仅供参考,具体以当地有关法规为准)

加入收藏
               

自己设计C++完善的异常处理类

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录