优雅地处理循环中的错误
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 引用(我已在此处说明)捕获,以说明多态层次结构。
我正在遍历一个列表并转换列表中的每个项目(一个文件名)。如果没有错误,我会为文件显示绿色图标,否则显示红色。我下面的代码有太多的逻辑来跟踪这个,它能更好吗?
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 引用(我已在此处说明)捕获,以说明多态层次结构。