是否曾经有人和我一样因为程序长期运行突然某天崩了而不知所措,或者找到问题根本原因需要做冒烟测试而无法向业主交代。那么如何让程序出错的情况下也能正常运行呢?那么一起来研究一下异常捕获吧,开发一个能BUG自适应的程序。
错误的用法
int add2(int a, int b) noexcept(false)
{
try
{
if(a==-b)
{
throw "they are convert nums";
}
}
catch(const std::exception& e)
{
qDebug()<<e.what();
return 0;
}
return a+b;
}
in:
add(10,-10);
out:
terminate called after throwing an instance of 'char const*'
正确用法
int add(int a, int b) noexcept(false)
{
QT_TRY
{
if(a==-b)
{
QT_THROW(QString("they are convert nums"));
}
}
QT_CATCH(QString eception)
{
qDebug()<<eception;
return 0;
}
QT_CATCH(const std::exception& e)
{
qDebug()<<e.what();
return 0;
}
return a+b;
}
int add2(int a, int b) noexcept(false)
{
try
{
if(a==-b)
{
throw QString("they are convert nums");
}
}
catch(QString e)
{
qDebug()<<e;
return 0;
}
return a+b;
}
int add3(int a, int b) noexcept(false)
{
try
{
if(a==-b)
{
throw QString("they are convert nums");
}
}
catch(...)
{
qDebug()<<"AAAAA";
return 0;
}
return a+b;
}
主要是throw的异常类型需要和catch的传参类型一致 ,若需要一旦发生异常就用某操作处理,可以用catch(...)捕获实现add3;
某些QT版本可能要在pro加一下代码:CONFIG += exception;
QException的使用
当出现异常情况很多时,我们不得不使用面向对象来分类处理,而不是简单的打印一个警告文本,这是就可以继承QException实现自己的MyException
///.h//
#ifndef MYEXCEPTION_H
#define MYEXCEPTION_H
#include <QException>
class MyException : public QException
{
public:
MyException(const QString msg);
QString msg() const;
private:
QString m_msg;
};
#endif // MYEXCEPTION_H
///.cpp//
#include "myexception.h"
MyException::MyException(const QString msg):m_msg(msg)
{
}
QString MyException::msg() const
{
return m_msg;
}
///客户端使用//
int add4(int a, int b) noexcept(false)
{
try
{
if(a==-b)
{
throw MyException("its two convert numbers");
}
if(a==b)
{
throw "a equal b";
}
}
catch(const MyException &e)
{
qDebug()<<e.msg();
return 0;
}
catch(...)
{
qDebug()<<"get other exception";
return 0;
}
return a+b;
}
/
qDebug()<<"111:"<<add4(10,-10);
qDebug()<<"222: "<<add4(10,10);
out:
"its two convert numbers"
111: 0
get other exception
222: 0