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);
}