优雅地处理循环中的错误

Handling errors in a loop gracefully

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

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"));

}

这个怎么样?

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"));

是否要尝试第二次 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 引用(我已在此处说明)捕获,以说明多态层次结构。