Keil4,STM32F4使用C++异常处理机制,一调用throw直接进入HardFault_Handler

2019-07-20 01:37发布

因为项目需要,将以前一个项目移植到keil中,由于代码中存在异常处理逻辑,也就是使用了 try{}catch(){}结构,发现只要代码执行到throw语句,就会导致进入异常处理中断函数:HardFault_Handler()中

硬件为STM32F429,keil4和keil5都试过了,编译选项也添加了 --exceptions

为了验证异常捕获机制,我新建了一个新工程,直接把keil官网的例子代码copy过来:

#include <stdlib.h>
#include <string.h>
#include <exception>

class runtime_error : public std::exception {
   public:
     runtime_error (const char* error)throw()
                         : m_perror(0)
                 {
                         if (error)
                         {
                                 m_perror = (char*)malloc(strlen(error) + 1);
                                 strcpy(m_perror, error);
                         }
                 }
                 
                 virtual ~runtime_error() throw()
                 {
                         if (m_perror)
                         {
                                 free(m_perror);
                                 m_perror = 0;
                         }
                 }
                 
    runtime_error(const exception&) throw()
                {
                        m_perror = (char*)malloc(16);
                        strcpy(m_perror, "NoInfo");
                }
               
    runtime_error& operator=(const runtime_error& obj) throw()
                {
                        m_perror = (char*)malloc(strlen(obj.m_perror) + 1);
                        strcpy(m_perror, obj.m_perror);
                       
                        return *this;
                }
               
    virtual const char* what() const throw()
                {
                        return m_perror;
                }
               
         protected:
                 char* m_perror;
};


static void ftest() throw()
{
       int i;

       i = 5;
       throw runtime_error("a runtime error");
}

void main()
{
        try
        {
                ftest();
        }
        catch (const runtime_error& e)
        {
                // 异常处理代码
        }

        while(1)
        {
                // 循环代码
        }
}

但是代码始终无法进入“异常处理代码”,也无法进入while循环,单步跟踪,只要到throw runtime_error("a runtime error"); ,立刻就进入了HardFault_Handler()函数中,不知有哪位朋友是否遇到过类似问题,由于只有11金钱,我全部奉上。如能解决问题,另有感谢!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。