QT的异常捕获

       是否曾经有人和我一样因为程序长期运行突然某天崩了而不知所措,或者找到问题根本原因需要做冒烟测试而无法向业主交代。那么如何让程序出错的情况下也能正常运行呢?那么一起来研究一下异常捕获吧,开发一个能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


     

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值