C++中可获得抛出位置和捕获位置的异常类

原创 2005年04月30日 10:55:00

可获得抛出异常位置和捕获异常位置的异常类

联系方法:dyj057@gmail.com

源代码:http://www.cnblogs.com/Files/dyj057/typeId.rar

我觉得C++中使用异常在使用中最大的不方便就是在抛出异常的时候没有位置信息,当程序到一定规模的时候,也很难确定异常从那里捕获的,不利于程序的调试。而在C#中,我发现它的异常的功能太强大了,可以确定异常的位置和捕获的位置,但它是靠CLR的功能实现的。那么我们怎么在C++中实现这个功能呢?

下面我就为大家介绍我写的可以获得抛出异常位置和捕获异常位置的异常类。该类使用标准C++实现,继承标准异常exception。你也可以按照这个思路实现一个MFC的版本。我在使用的时候就是使用两个不同的版本。MFC的版本的功能要强大一点,它内置了Win32错误代码转换错误信息的转换函数,为程序提供更强大的异常处理功能。

现在来看看类的定义:

class more_exception :

        public exception

    {

    public:

        more_exception(string what, string throw_file,

            string throw_function, int throw_line) ;

        more_exception(const more_exception& right);

        more_exception& operator=(const more_exception& right);

        virtual ~more_exception(void) ;

        virtual const char *what( ) const;

        //throw exception position

        const char *get_throw_file() const ;

        const char *get_throw_function() const ;

        int get_throw_line() const ;

        //set catch exception position

        void set_catch_file(const char *catch_file);

        void set_catch_function(const char *catch_function);

        void set_catch_line(int catch_line);

        //get catch exception position

        const char *get_catch_file() const ;

        const char *get_catch_function() const ;

        int get_catch_line() const ;

    private:

        string m_what;

        string m_throw_file;

        string m_throw_function;

        int m_throw_line;

        string m_catch_file;

        string m_catch_function;

        int m_catch_line;

    };

定义非常的简单,没有什么技巧可言,很容易懂。最重要的是使用了两个宏获得抛出异常位置的信息和捕获异常的位置信息。

l         获得抛出异常的位置信息

#define THROWEXCEPTION(what) more_exception ex(what, __FILE__, __FUNCTION__, __LINE__); throw ex;

当你需要抛出异常的时候,使用这个宏替代一般的方法。

比如:使用THROWEXCEPTION(“There is a exception”) 来代替throw ex(“There is a exception”),这样就可以可以获得方便的获得异常的抛出的位置,当然你可以自己执行宏里面的方法。

捕获异常的时候一定要使用引用来捕获异常,至于为什么,请看《More Effective C++》的异常部分。

l         获得捕获异常的位置信息

#define SETCATCHEXCEPTIONPOS (more_ex)  more_ex.set_catch_file (__FILE__); more_ex.set_catch_function ( __FUNCTION__ ); more_ex.set_catch_line(__LINE__);

这个宏也很简单是用来为捕获到异常添加捕获异常的位置信息的。使用方法:

try

  {

     

  }

  catch(more_exception &e)

  {

      SETCATCHEXCEPTIONPOS(e);

      print(e);

}

      与C#中的异常类比较,它少了异常扩散的路径,甚是遗憾。

注意:源程序在Windows XP professional + SP2, Visual .NET 2003 环境下编译通过。

C++抛出异常技巧讲解

  • 2013年04月28日 17:37
  • 2KB
  • 下载

c++中使用基类指针Vector 存放子类对象(0xcccccccc 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突 )

1. c++中允许用基类指针指向子类的对象,先亮出正确写法。 #include #include using namespace std; class Base { public: ...

C++ 抛出并捕获多个异常

// Project20161020.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include ...

C++:抛出异常与类的引用

新建一个控制台程序,添加2个新类:Employee与Database 头文件 stdafx.h: #pragma once #include "targetver.h" #include #in...

从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开

一、程序错误 编译错误,即语法错误。程序就无法被生成运行代码。 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运...

Microsoft C++ 异常: 内存位置 **处的 mwException

看到各种mwException问题都没答案,现在将我自己遇到的问题与解决方案提供如下,希望能帮助和我遇到相同问题的筒子们。 问题描述: 用VS2010调用matlab生成的dll时出错,报mwEx...

C/C++捕获段错误,打印出错的具体位置(精确到哪一行

C/C++捕获段错误,打印出错的具体位置(精确到哪一行) 2011-05-14 03:42:38 分类: LINUX 其实还可以使用 glibc 的 backtrace_s...

c++ 使用throw抛出异常

抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为: throw 表达式;     如果在try语句块的程序段中(包括...

c++ 使用throw抛出异常

抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为: throw 表达式;     如果在try语句块的程序段中(...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中可获得抛出位置和捕获位置的异常类
举报原因:
原因补充:

(最多只允许输入30个字)