首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c、c++怎么利用try catch 实现崩溃日志?

2013-08-09 
c、c++如何利用try catch 实现崩溃日志????如何利用try catch 实现崩溃日志?就是程序崩溃了,纪录崩溃的所在

c、c++如何利用try catch 实现崩溃日志????
如何利用try catch 实现崩溃日志?
就是程序崩溃了,纪录崩溃的所在函数到日志?如何实现,有没有现成的例子,学习一下,谢谢!
[解决办法]

try…catch语句形式如下:

try

{

语句; //说明抛出异常的部位,该部位含有抛出异常的语句,

//如调用抛出异常的方法。

}

catch (异常类1  变量名) //按抛出的异常类进行捕获,并加处理

{

catch 处理

}

catch (异常类2  变量名)//按抛出的异常类进行捕获,并加处理

{

catch 处理

}

[finally 语句]


当catch前面的try块中发生了一个异常,try-catch语句就会自动在try块后面的各个catch块中,找出与该异常类相匹配的参数。当参数符合以下三个条件之一时,就认为这个参数与产生的异常相匹配:

(1)参数与产生的异常属于一个类;

(2)参数是产生的异常的超类;

(3)参数是一个接口时,产生的异常实现了这一接口。

当产生的异常找到了第一个与之相匹配的参数时,就执行包含这一参数的catch语句中的Java代码,执行完catch语句后,程序恢复执行,但不会回到异常发生处继续执行,而是执行try-catch结构后面的代码。

[解决办法]
我想先问下, 你用的代码中有throw语句吗?

1. 有;不catch,崩溃时日志自然就有了。
2. 没有;catch也没有用。
[解决办法]
http://www.doc88.com/p-073840796464.html
有些函数在遇到异常操作时,会使用抛出处理(throw),这时你调用该函数   
  时,就需要用到try   catch   来拦截这些抛出(throw)。
  void   Test(bool   Throw)   
  {   
            if   (Throw)   
                    throw   Exception("throw   in   funtion   Test.");   
  }   
    
  void   main()   
  {   
          try   {   
                  Test(true);   
          }   
          catch(Exception&   e)   {   


                  ShowMessage(e.Message);   
          }   
  }   


[解决办法]
https://www.google.com.hk/search?newwindow=1&safe=strict&client=aff-cs-360chromium&hs=P1S&q=%E6%89%93%E5%8D%B0%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E5%A0%86%E6%A0%88&oq=%E6%89%93%E5%8D%B0%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E5%A0%86%E6%A0%88&gs_l=serp.3..0i5i30.32112.32112.0.32564.1.1.0.0.0.0.204.204.2-1.1.0....0...1c.4.22.serp..0.1.203.xF3b64pzMwY
[解决办法]
1. 首先,崩溃的话,try/catch未必有用  (这个最关键了)
2. 其次,exception会往外传递,catch到的exception未必是从写代码的这个函数抛出的  (这个不太重要)
3. 再者,catch里面记日志可能会引发新的exception,导致死循环  (这个严重但不常见)
4. 最后,问个问题:是否所有抛异常的地方,你都会加catch  (这个也很重要)

如果上面的问题都不是问题,下面是我想到的解决方案: 
用宏来替换try/catch

#include <iostream>

void log(const char * file, const char * func, int line)
{
    std::cout << "exception: " << file << ":" << func << ":" << line << std::endl;
}

#define TRY                                  \
try                                          \
{

#define CATCH_TYPE(type)                     \
}                                            \
catch (type & e)                             \
{                                            \


    log(__FILE__, __FUNCTION__, __LINE__);

#define CATCH_ALL                            \
}                                            \
catch (...)                                  \
{                                            \
    log(__FILE__, __FUNCTION__, __LINE__);

#define CATCH_END                            \
}

int main(int argc, char * argv[])
{
    {
        TRY
            throw int();
        CATCH_TYPE(int)
            std::cout << "catch a exception" << std::endl;
        CATCH_END
    }

    {
        TRY
            throw int();
        CATCH_ALL
            std::cout << "catch a exception" << std::endl;
        CATCH_END
    }
    
    return(0);
}


热点排行