partition
и rpartition
также удобны для таких вещей:
url.rpartition('/')[2]
Нет. Я предлагаю вам изменить сигнатуру вашей первой функции, чтобы она возвращала исключение, а не бросала его, и оставляла оператор throw в вашей второй функции. Это будет радовать компилятор и пахнет не так плохо.
Бернхоф ответил правильно. Однако, если вы пытаетесь инкапсулировать большую часть логики при создании экземпляра вашего исключения, тогда все, что вам нужно сделать, это изменить свой код с этого: 117] Тогда ваш код вызова будет выглядеть следующим образом:
int foo(int x, y) {
if (y == 0) {
throw makeException("Doh!");
}
return x / y;
}
При прочих равных условиях предпочитают функциональный код процедурному коду. Проще использовать повторно и юнит-тестирование.
РЕДАКТИРОВАТЬ:
В свете примера кода Фреда, это то, что я бы сделал. Это не кодовый контракт, но он все еще функционирует.
private int getVarID(string s_varID) {
int varID;
if(s_varID == "ILT") {
return 123;
} else if(s_varID == "TL") {
return 456;
} else if(s_varID == "FT") {
return 789;
} else if(int.TryParse(s_varID, out varID)) {
return varID;
} else {
throw makeParseError("varID must be an integer or 'ILT', 'TL' or 'FT'.");
}
}
Не передавайте создание исключения другой функции (то есть, просто создавайте ее напрямую), и компилятор не будет жаловаться. Передача функции типа «помощник» для выдачи исключений является пустой тратой времени, если только функция не добавляет значение к процессу исключения.
Бернхоф уже дал вам способ избежать жалоб компилятора. Однако следует также помнить, что трассировка стека будет отключена (а некоторые библиотеки логгеров не будут обрабатывать методы util-classed-i-throw-exceptions-for-your-app), что затрудняет отладку приложения.
Почему бы просто не поменять его на
int foo(int x, y)
{
if (y == 0)
throwException("Doh!");
return x/y;
}
Это даст те же самые результаты выполнения, и компилятор не будет жаловаться.
Ваша функция
void throwException(string msg)
{
throw new MyException(msg);
}
добавляет нулевое значение к коду, следовательно, ваш вопрос является спорным. Если же, с другой стороны, вы хотите выдать ошибку с одним и тем же сообщением по всему классу и минимизировать дублирование кода, то это то, что вы должны сделать.
Обычной практикой было бы расширить MyException
для этого конкретного случая и бросить следующее:
public class HomerSimpsonException : MyException
{
public HomerSimpsonException() : base ("DOH!!!"){
}
}
int foo(int x, y)
{
if (y == 0)
throw new HomerSimpsonException();
else
return x/y;
}
Даже в этом случае, согласно правилу Microsoft для расширения исключений, существует как минимум 4 конструктора, которые вы должны реализовать - http://msdn.microsoft.com/en-us/library/ms182151%28VS.80. %29.aspx, а именно:
public NewException(){}
public NewException(string){}
public NewException(string, Exception){}
protected or private NewException(SerializationInfo, StreamingContext){}
Удалите ключевое слово 'else', оно все равно избыточно, и оно сработает;)