Bootstrap

Qt 异常处理的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或者错误什么的,只是了解的不多导致的。

;