Qt异常处理
序言
记录下Qt的异常处理使用,本来是挺简单的,但有两处容易坑的地方坑了我,所以特地记录一下。
使用前配置,Qt Creator与VS
Qt Creator中的pro加上下面的代码可以使用
CONFIG += exceptions
QMAKE_CXXFLAGS_EXCEPTIONS_ON = /EHa
QMAKE_CXXFLAGS_STL_ON = /EHa
Microsoft Visual Studio中的话,只需要在属性中更改选项即可。
配置属性 -》 C/C++ -》 代码生成 -》 启用C++异常 -》是,但有SEH异常(/EHa)
代码中的使用
QT_TRY
{
throw QString("仅测试使用的错误");
}
QT_CATCH(QString e)
{
QMessageBox::critical(this, "Error", e, QMessageBox::Ok);
}
坑点简答
1、配置中:Qt Creator中,该异常处理必须使用MSVC才可以,MinGW会报错。
2、使用中:throw与catch中产生的错误
大概是下面写的弹出框
Microsoft Visual C++ Runtime Library
Debug Error
abort() has been called
问题例子代码:
QT_TRY
{
throw "仅测试使用的错误";
//throw QLatin1String("仅测试使用的错误");
}
QT_CATCH(QString e)
{
QMessageBox::critical(this, "Error", e, QMessageBox::Ok);
}
原因:在该异常处理中,无法进行明面上的隐式转换,因为其严格遵守按不同类型使用不同的catch,在上面代码中,实际是没写出对应的处理代码导致的。
解决方法:
1、throw的类型和catch的类型要保持一致
QT_TRY
{
throw QString("仅测试使用的错误");
}
QT_CATCH(QString e)
{
QMessageBox::critical(this, "Error", e, QMessageBox::Ok);
}
2、catch的类型写多一些,正好对应throw的类型
QT_TRY
{
throw QLatin1String("仅测试使用的错误");
}
QT_CATCH(QString e)
{
QMessageBox::critical(this, "Error", e, QMessageBox::Ok);
}
QT_CATCH(QLatin1String e)
{
QMessageBox::critical(this, "Error", e, QMessageBox::Ok);
}
注:已测过,就算使用模板,也得写成对应的类型
其实并非是Qt的bug或者错误什么的,只是了解的不多导致的。