异常类Exception

Exception.h

 1 #ifndef EXCEPTION_H
 2 #define EXCEPTION_H
 3 #include <string>
 4 #include <exception>
 5
 6
 7 class Exception : public std::exception
 8 {
 9 public:
10     explicit Exception(const char *what);
11     explicit Exception(const std::string &what);
12     virtual ~Exception() throw();
13     virtual const char *what() const throw();
14     const char *stackTrace() const throw();
15
16 private:
17     void fillStackTrace();
18
19     std::string demangle(const char *symbol);
20     std::string _message;
21     std::string _stack;
22 };
23
24
25
26
27 #endif

Exception.cpp

 1 #include "execption.h"
 2 #include <cxxabi.h>
 3 #include <execinfo.h>
 4 #include <stdlib.h>
 5 #include <stdio.h>
 6
 7 using namespace std;
 8
 9 Exception::Exception(const char *what)
10     :_message(what)
11 {
12     fillStackTrace();
13 }
14
15 Exception::Exception(const std::string &what)
16     :_message(what)
17 {
18     fillStackTrace();
19 }
20
21 Exception::~Exception() throw()
22 {
23
24 }
25
26 const char *Exception::what() const throw()
27 {
28     return _message.c_str();
29 }
30
31 const char *Exception::stackTrace() const throw()
32 {
33     return _stack.c_str();
34 }
35
36 void Exception::fillStackTrace()
37 {
38     const int len = 200;
39     void *buffer[len];
40     int nptrs = ::backtrace(buffer, len);
41
42     char **strings = ::backtrace_symbols(buffer, nptrs);
43
44     if(strings)
45     {
46         for(int i = 0; i != nptrs; ++ i)
47         {
48             _stack.append(demangle(strings[i]));
49             _stack.push_back(‘\n‘);
50         }
51         free(strings);
52     }
53 }
54
55
56 string Exception::demangle(const char *symbol)
57 {
58     size_t size;
59     int status;
60     char tmp[128];
61     char *demangled;
62
63     if(1 == sscanf(symbol, "%*[^(]%*[^_]%127[^)+]", tmp))
64     {
65         if(NULL != (demangled = abi::__cxa_demangle(tmp, NULL, &size, &status)))
66         {
67             string result(demangled);
68             free(demangled);
69             return result;
70         }
71     }
72
73     if(1 == sscanf(symbol, "%127s", tmp))
74     {
75         return tmp;
76     }
77
78     return symbol;
79 }

测试代码:

 1 #include "Exception.h"
 2 #include <stdio.h>
 3
 4 using namespace std;
 5
 6 class Bar
 7 {
 8     public:
 9         void test()
10         {
11             throw Exception("oops");
12         }
13 };
14
15 void foo()
16 {
17     Bar b;
18     b.test();
19 }
20
21
22 int main(int argc, const char *argv[])
23 {
24
25     try
26     {
27         foo();
28     }
29     catch(const Exception &ex)
30     {
31         printf("reason : %s\n", ex.what());
32         printf("stack trace : %s \n", ex.stackTrace());
33     }
34     return 0;
35 }

显示结果如下:

reason : oops
stack trace : Exception::fillStackTrace()
Exception::Exception(char const*)
Bar::test()
foo()
./a.out(main+0x10)
/lib/libc.so.6(__libc_start_main+0xe6)
./a.out()

编译时不要忘记 : 加上-rdynamic

时间: 2024-11-13 23:34:43

异常类Exception的相关文章

借助backtrace和demangle实现异常类Exception

C++的异常类是没有栈痕迹的,如果需要获取栈痕迹,需要使用以下函数: #include <execinfo.h> int backtrace(void **buffer, int size); char **backtrace_symbols(void *const *buffer, int size); void backtrace_symbols_fd(void *const *buffer, int size, int fd); backtrace将当前程序的调用信息存储在buffer中

每天一点儿java---继承exception类来实现自己的异常类

package prac_1; /** * <p>Title: 捕获异常和实现自己的异常类</p> * <p>Description: 通过继承Exception类来实现自己的异常类.并使用try-catch来捕获这个异常.</p> * <p>Copyright: Copyright (c) 2014</p> * <p>Filename: </p> * @author 王海涛 * @version 0.1 */

2019-2-21.NET中异常类(Exception)

.NET中异常类(Exception) 异常:程序在运行期间发生的错误.异常对象就是封装这些错误的对象. try{}catch{}是非常重要的,捕获try程序块中所有发生的异常,如果没有捕获异常的话,程序运行的线程将会挂掉,更严重的是这些错误有可能会直接抛给用户,让用户看到.所以说在程序的最外层必须要有捕获异常的程序.这样至少确保程序的正常运行.还有一点就是,捕获异常之后需要记录下来,这样对于我们排查问题也是有帮助的. 什么情况下,不需要捕获异常呢? 1.发生此类错误的时候,就没必要执行之后的代

Asp.net Core WebApi 全局异常类

通过全局异常类,所有程序中遇到的错误都会被拦截,并友好的返回结果. 1.自定义一个全局异常处理类中间件 using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Threading.Tasks; using Syst

java中异常类与类别

异常类的层次结构: 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性,它们都在java.lang包下面. Error类标记了严重错误,类似内存溢出,虚拟机异常,等等,是不该出现的.这些错误表示故障发生于虚拟机自身.或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError).类定义错误(NoClassDefFoundError)等.这些错

类的继承与super()的意义以即如何写一个正确的异常类

这些东西都是我看了许多名师课程和自己研究的成果,严禁转载,这里指出了如何正确的自己定义一个异常类并看一看sun写的java的源代码话题一:子类的构造器执行是否一定会伴随着父类的构造执行? 1.this()与super()不能共存2.如果不显示地调用this()和super();子类对象的创建是否一定执行父类的构造3.既然super()和this()不能共存,又说子类的构造执行一定会执行父类的构造,那么我让子类的构造执行this()是不是就不能在执行父类的构造? 4.如果我非不让父类的构造执行,我

java中常见的异常类

1. java.lang.nullpointerexception   这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等.对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了.数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空

C++异常类的定义和使用以及我对异常类的理解

异常类的作用就是在执行我们自己的某个功能函数出现意外情况时,为了方便查找错误出处,可以在意外发生时抛出异常(1).首先定义自己的异常类 可以直接定义也可以从标准异常类派生    class  CEGUIEXPORT Exception    {    public:        virtual ~Exception(void);        const String& getMessage(void) const  {return d_message;}        const Strin

中断(interrupt)、异常(exception)、陷入(trap)

http://blog.chinaunix.net/cp.php?ac=blog 中断:是为了设备与CPU之间的通信.典型的有如服务请求,任务完成提醒等.比如我们熟知的时钟中断,硬盘读写服务请求中断.中断的发生与系统处在用户态还是在内核态无关,只决定于EFLAGS寄存器的一个标志位.我们熟悉的sti, cli两条指令就是用来设置这个标志位,然后决定是否允许中断.在单个CPU的系统中,这也是保护临界区的一种简便方法.中断是异步的,因为从逻辑上来说,中断的产生与当前正在执行的进程无关.事实上,中断是