正常处理循环中的错误

时间:2015-02-25 16:20:49

标签: c++ qt exception

我正在遍历列表并转换列表中的每个项目(文件名)。如果没有错误,我会显示文件的绿色图标,否则显示红色。我的下面的代码有一点逻辑来跟踪它,可能会更好吗?

for(int i = 0; i < numFiles; i++)
{
    ......

    int allConverted = 0;

    try
    {
        convertFile( file, dest1)

        allConverted++;
    }
    catch(std::runtime_error err)
    {
        item->setIcon( QIcon("c:/code/Red.ico"));

        QMessageBox::information(this, APP_NAME, err.what(), QMessageBox::Ok, QMessageBox::Abort) == QMessageBox::Abort);
    }

    try
    {
        convertFile( file, dest2)

        allConverted++;
    }
    catch(std::runtime_error err)
    {
        item->setIcon( QIcon("c:/code/Red.ico"));

        QMessageBox::info(this, APP_NAME, err.what(), QMessageBox::Ok, QMessageBox::Abort) == QMessageBox::Abort);

    }

    if (allConverted >= 2)
        item->setIcon( QIcon("c:/code/Green.ico"));

}

2 个答案:

答案 0 :(得分:1)

即使第一次通话失败,您是否想尝试第二次convertFile?如果这是预期的,那么这样的东西会更清洁:

for(int i = 0; i < numFiles; i++) {

    bool success = true;

    try {
        convertFile(file, dest1);
    }
    catch(const std::runtime_error& err) {
        success = false;
        QMessageBox::information(this, APP_NAME, err.what(), QMessageBox::Ok, QMessageBox::Abort) == QMessageBox::Abort);
    }

    try {
        convertFile(file, dest2);
    }
    catch(const std::runtime_error& err) {
        success = false;
        QMessageBox::info(this, APP_NAME, err.what(), QMessageBox::Ok, QMessageBox::Abort) == QMessageBox::Abort);
    }

    if (success) {
        item->setIcon(QIcon("c:/code/Green.ico"));
    }
    else {
        item->setIcon(QIcon("c:/code/Red.ico"));
    }
}

否则,它可以简化为:

for(int i = 0; i < numFiles; i++) {
    try {
        convertFile(file, dest1);
        convertFile(file, dest2);
        item->setIcon(QIcon("c:/code/Green.ico"));
    }
    catch(const std::runtime_error& err) {
        item->setIcon(QIcon("c:/code/Red.ico"));
        QMessageBox::information(this, APP_NAME, err.what(), QMessageBox::Ok, QMessageBox::Abort) == QMessageBox::Abort);
    }
}

在旁注中,异常通常应该由const引用(我在此处说明)捕获,以便考虑多态层次结构。

答案 1 :(得分:0)

这个怎么样?

for(int i = 0; i < numFiles; i++)
{
    bool anyErrors = false;

    try
    {
        convertFile( file, dest1)
        convertFile( file, dest2)
    }
    catch(std::runtime_error err)
    {
        anyErrors = true;
    }

    if (anyErrors)
    {
        item->setIcon( QIcon("c:/code/Red.ico"));
        QMessageBox::information(this, APP_NAME, err.what(), QMessageBox::Ok, QMessageBox::Abort) == QMessageBox::Abort);
    }
    else        
        item->setIcon( QIcon("c:/code/Green.ico"));