Это полностью зависит от того, что это за ошибка, и какова работа метода. Если возвращение ERROR
является допустимым способом обработки этой ошибки для вызывающей функции, почему это будет плохо?
Часто, однако, это является запахом. Учтите это:
bool isDouble(string someString) {
try {
double d = Convert.ParseInt32(someString);
} catch(FormatException e) {
return false;
}
return true;
}
Это очень сильный запах кода, потому что вы не ожидаете двойного значения. Вы просто хотите знать, содержит ли строка double.
Иногда у используемой платформы нет других способов делать то, что вы хотите. Для вышесказанного есть лучший способ:
bool isDouble(string someString) {
bool success;
Convert.TryParseInt32(someString, ref success);
return success;
}
У такого рода исключений есть специальное имя, придуманное каким-то чуваком, чей блог я недавно читал. Но, к сожалению, я забыл его имя. Пожалуйста, прокомментируйте, если вы это знаете. И последнее, но не менее важное: приведенный выше псевдокод. Я не разработчик на C #, поэтому вышеприведенное не компилируется, я уверен, но TryParseInt32 / ParseInt32 демонстрирует, что я думаю, так что я собираюсь использовать C #.
Теперь к вашему коду. Давайте проверим две функции. Один пахнет, а другой нет:
1. Запах
public int setupSystem() {
doA();
try { doB(); }
catch (MyException e)
{ return ERROR; }
doC();
return SUCCESS;
}
Это запах кода , потому что когда вы хотите настроить систему, вы не хотите, чтобы она выходила из строя. Если вы не настроите систему, вы не сможете продолжить работу без этой ошибки.
2. Ok
public int pingWorkstation() {
doA();
try { doB(); }
catch (MyException e)
{ return ERROR; }
doC();
return SUCCESS;
}
Это нормально, потому что цель этого метода - проверить, достижима ли рабочая станция. Если это не так, то это часть результата этого метода, а не исключительный случай, когда требуется альтернативный путь возврата.